Come posso ordinare in Oracle una colonna Varchar2 o NVarchar2 per essere nel mio ordine definito personalizzato. Oppure sono disponibili opzioni esistenti che inseriranno prima le lettere, quindi i numeri, quindi tutti i caratteri speciali.
Il nostro primo approccio consisteva nell'utilizzare una funzione che esegue manualmente la mappatura dei caratteri ai numeri.
select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
La funzione di ordinamento speciale associa ciascun carattere a un numero di 2 cifre e il valore restituito viene utilizzato per l'ordinamento. Questa sembra essere solo una concatenazione davvero costosa e sembra sbagliata.
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;
Sto facendo fatica a trovare un approccio alternativo. Voglio sapere quali problemi esistono con questo approccio. Forse non abbiamo alternative.
Addendum 1:
Aggiunta di esempio di dati ordinati. In generale, tutti i caratteri alfa non fanno distinzione tra maiuscole e minuscole, quindi numeri 0-9, quindi caratteri speciali in qualsiasi ordine.
Ecco un esempio di elenco crescente ordinato. Tieni presente che i caratteri speciali sono intercambiabili, tutti dovrebbero essere dopo lettere e numeri. In ordine binario, alcuni caratteri speciali sono prima delle lettere (es. ')
Il mio ordine desiderato,
AB1 $
aCC #
ac '
BZ
Ordine binario Oracle
AB1 $
BZ
ac '
acc #