Comment puis-je trier dans Oracle une colonne Varchar2 ou NVarchar2 pour qu'elle soit dans mon propre ordre personnalisé défini. Ou existe-t-il des options existantes qui placeront les lettres en premier, puis les chiffres, puis tous les caractères spéciaux.
Notre première approche consistait à utiliser une fonction qui mappe manuellement les caractères aux nombres.
select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
La fonction de tri spéciale mappe chaque caractère à un nombre à 2 chiffres et la valeur de retour est utilisée pour le tri. Cela semble être une concaténation vraiment très chère, et cela semble mal.
for i in 1..length(sorted_text)
loop
v_result:=v_result || case substr(sorted_text,i,1)
WHEN ' ' THEN 82 WHEN '!' THEN 81 WHEN '"' THEN 80 WHEN '#' THEN 79 WHEN '$'
..............
WHEN 'u' THEN 15 WHEN 'U' THEN 15 WHEN 'v' THEN 14 WHEN 'V' THEN 14 WHEN 'w' THEN 13 WHEN 'W' THEN 13 WHEN 'x'
....
else 90 end;
end loop;
J'ai du mal à trouver une approche alternative. Je veux savoir quels problèmes existent avec cette approche. Peut-être que nous n'avons pas d'alternatives.
Addendum 1:
Ajout d'un exemple de données triées. En général, tous les caractères alpha ne respectent pas la casse, puis les chiffres 0 à 9, puis les caractères spéciaux dans n'importe quel ordre.
Voici un exemple de liste ascendante triée. Gardez à l'esprit que les caractères spéciaux sont interchangeables, ils devraient tous être après des lettres et des chiffres. En tri binaire, certains caractères spéciaux sont avant les lettres (par exemple ')
Ma commande souhaitée,
AB1 $
aCC #
ac '
BZ
Ordre binaire Oracle
AB1 $
BZ
ac '
acc #