viernes, 12 de junio de 2009

Ordenar resultados por el alfabeto castellano

Por defecto, el ordenamiento de una consulta SQL en Oracle se rige según el valor numérico del mapa de caracteres, típicamente: A, B, C, D, E , F, G, H, I, etc. Este método, que recibe el nombre de ordenamiento binario, es el método más eficiente y conveniente para ordenar palabras en inglés.

Sin embargo, las palabras del castellano no serán ordenadas correctamente, y muchas veces debemos respetar las reglas de nuestro idioma (aunque la popularidad del inglés diga lo contrario).

Por ejemplo si listamos países, Chile aparecerá antes que Colombia, cuando la letra 'CH' debería suceder a la 'C'. Similarmente la palabra lluvia aparecerá antes que lotería, cuando no deberíamos ignorar que la 'LL' viene despues de la 'L'. Finalmente recordar que nuestra original letra eñe no puede ser dejada de lado.

Para ordenar usando las letras del español, bastará con alterar la sesión:

ALTER SESSION SET nls_sort=spanish_m;

Ejemplo

SQL> select * from paises order by nombre;

NOMBRE
------------
Camerún
Canadá
Chile
Colombia
Congo
Cuba

SQL> alter session set nls_sort=spanish_m;

Session altered

NOMBRE
------------
Camerún
Canadá
Colombia
Congo
Cuba
Chile

Acentos y mayúsculas

Otro efecto de setear el parametro nls_sort, es que suprimimos la precedencia de palabras acentuadas sobre no acentuadas, así como de mayúsculas sobre minúsculas.

Ejemplo 1: Problema de acentos

SQL> select letra from mialfabeto order by letra;

LETRA
--------
a
b
c
á

SQL> alter session set nls_sort=spanish_m;

SQL> select letra from mialfabeto order by letra;

LETRA
--------
a
á
b
c

Ejemplo 2: Problema de mayúsculas que anteceden a minúsculas

SQL> select texto from conceptos order by texto;

TEXTO
--------------
Integrado
distribuído
integración

SQL> alter session set nls_sort=spanish_m;

SQL> select texto from conceptos order by texto;

TEXTO
--------------
distribuído
integración
Integrado

4 comentarios:

Anónimo dijo...

Hola,
No sé de qué país sos, pero hasta donde recuerdo, las letras 'CH', 'LL', así como 'RR' fueron eliminadas del español hace muchos años. Por lo que me parece que 'Lluvia' va antes de 'Lotería' y 'Chile' antes de 'Colombia'.

Por lo demás el artículo está interesante.

Monterrey dijo...

Hola,

Concuerdo con la observación, pero las letras ch y ll no fueron eliminadas si miras en el diccionario esta la definicion, ellas siguen existiendo solo que no se consideran mas para ordenacion. Y rr nunca fue una letra creo. Por lo demas me ha interesado tambien.

Anónimo dijo...

El articulo se entendio perfecto. y muy buen aporte!

Anónimo dijo...

Hola,

Trabajo integrando algunos sistemas legados donde todavia se sigue utilizando el criterio de letras dobles para ordenar los registros. Necesitaba resolver esto, gracias!!