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