¿Cómo comparamos palabras que pueden contener acentos?
Un problema frecuente cuando manipulamos datos es la aparición de acentos propios del idioma español correctamente escrito. Como la mayoría de los juegos de caracteres están basados en Unicode, práctimente podemos encontrar símbolos de casi cualquier lengua.
Con nuestro idioma español seteado (parámetro NLS_LANGUAGE), podemos comprobar que 'Á' es mayor que 'á':
SQL> select greatest('Á','á') from dual;
GR
--
Á
A su vez 'á' es mayor que 'a':
SQL> select greatest('á','a') from dual;
GR
--
á
Luego 'a' es mayor que 'A'
SQL> select greatest('A','a') from dual;
G
-
a
Pasando en limpio tenemos que: Á > á > a > A
Para evitar estos problemas de orden de los caracteres con acentos (incluímos la ñ y Ñ) dentro de la plantilla de caracteres, nos conviene traducir estos caracteres a un solo formato en mayúscula y desasentuado (despues de todo para ordenar no nos importan estas diferencias).
La función TRANSLATE viene como anillo al dedo para esta necesaria conversión de caracteres. La sintáxis básica es: TRANSLATE(cadena
Lo aplicaremos así:
UPPER(TRANSLATE(
SQL> SELECT UPPER(TRANSLATE('HABÍAn relámpagos','ÁÉÍÓÚáéíóú','AEIOUAEIOU'
)) TEXTO FROM DUAL;
TEXTO
-----------------
HABIAN RELAMPAGOS
Es aconsejable tener un paquete con una función que reciba una cadena, aplique estas funciones de conversión y retorne la cadena desacentuada. Evitará reescribir código y además tendremos la función cacheada en memoria para las siguientes invocaciones.
UPPER/TRANSLATE podrá usarse en SQL para comparar cadenas, con el cuidado necesario para evitar anular índices por el uso de funciones. Es necesario evaluar el alterar los datos almacenados de forma de eliminar la acentuación, o crear índices de función que estén definidos con la funcion de conversión. Dependerá de cada caso particular que es lo más conveniente.
Ver también:
Como detectar caracteres extraños o no imprimibles
jueves 25 de octubre de 2007
Acentos del idioma español
Suscribirse a:
Enviar comentarios (Atom)

0 comentarios:
Publicar un comentario en la entrada