¿Cómo puedo ordenar en Oracle una columna Varchar2 o NVarchar2 para que esté en mi propio orden definido personalizado? O hay opciones disponibles que pondrán letras primero, luego números, luego todos los caracteres especiales.
Nuestro primer enfoque fue utilizar una función que hace un mapeo manual de caracteres a números.
select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
La función especial de clasificación asigna cada carácter a un número de 2 dígitos, y el valor de retorno se utiliza para la clasificación. Esto parece ser una concatenación realmente costosa, y se siente 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;
Me está costando trabajo encontrar un enfoque alternativo. Quiero saber qué problemas existen con este enfoque. Quizás no tenemos alternativas.
Anexo 1:
Agregar ejemplo de datos ordenados. En general, todos los caracteres alfa distinguen entre mayúsculas y minúsculas, luego los números 0-9, luego los caracteres especiales en cualquier orden.
Aquí hay una lista ordenada ascendente de muestra. Tenga en cuenta que los caracteres especiales son intercambiables, todos deben ir después de letras y números. En orden binario, algunos caracteres especiales están antes de las letras (es decir, ')
Mi pedido deseado,
AB1 $
aCC #
ac '
BZ
Orden binario de Oracle
AB1 $
BZ
ac '
acc #