Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/05/2009, 13:04
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Función translate en mysql

Hoy tuve un problema con una consulta que muchas veces se ha presentado en este foro y en el mundo en general.

Como realizar una consulta en la cual, no me distinga las palabras con acento en una consulta. La solución para mysql es pelear con la molesta codificación de la tabla o de la base de datos en general.

Encontré una solución muy particular y efectiva para oracle y postgres haciendo uso de la función translate.
http://www.postgresql.org/docs/8.2/s...ns-string.html
La cual basta con realizar translate(campo,'áéíóúÁÉÍÓÚ','aeiouAEIOU') para ignorar las palabras que llevan acento y permitir una consulta tanto de palabras que tienen o no acento.

Lastimosamente mysql no cuenta con una función así (o por lo menos no la encontré) así que decidí crear una que simule en parte este molesto problema.

Comparto la función, por si alguien desea usarla y la forma como deben implementarla. (Acepto sugerencias y comentarios al respecto)


EJEMPLO

Código mysql:
Ver original
  1. mysql> select nombre,sexo from persona;
  2. +----------------+------+
  3. | nombre         | sexo |
  4. +----------------+------+
  5. | maría fernanda | F    |
  6. | maria lucia    | F    |
  7. | lucía          | F    |
  8. +----------------+------+
  9. 3 rows in set (0.00 sec)

Como ven, en los registros, maria y lucia se encuentran con acento y sin acento. Para una consulta de personas llamadas lucia o maria quedaría:

Código mysql:
Ver original
  1. mysql> select nombre,sexo from persona where translate(lower(nombre)) like translate('%maria%');
  2. +----------------+------+
  3. | nombre         | sexo |
  4. +----------------+------+
  5. | maría fernanda | F    |
  6. | maria lucia    | F    |
  7. +----------------+------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. mysql> select nombre,sexo from persona where translate(lower(nombre)) like translate('%lucía%');
  11. +-------------+------+
  12. | nombre      | sexo |
  13. +-------------+------+
  14. | maria lucia | F    |
  15. | lucía       | F    |
  16. +-------------+------+
  17. 2 rows in set (0.00 sec)

La función es esta:

Código mysql:
Ver original
  1. DROP FUNCTION translate;
  2. DELIMITER $$
  3.  
  4. CREATE FUNCTION translate(campo varchar(50)) RETURNS VARCHAR(50)
  5. ----------------------------------------
  6. --Declaración de variables requeridas---
  7. ----------------------------------------
  8.  
  9. --------------------------------------------------------------------
  10. --* Longitud guarda el numero de digitos de la palabra ingresada. --
  11. --* contador recorre cada posición para comparar.                 --  
  12. --* campo_aux recibe el valor de cada letra,se haya cambiado o no.--
  13. --* campo_mod es la cadena a retornar. Con ls correcciones.       --
  14. --------------------------------------------------------------------
  15.  DECLARE longitud integer;    
  16.  DECLARE contador integer;
  17.  DECLARE campo_aux varchar(50);      
  18.  DECLARE campo_mod varchar(50);    
  19.  
  20. --------------------------------
  21. --Inicialización de variables---
  22. --------------------------------
  23.  set campo_mod = '';
  24.  set campo_aux = '';
  25.  set contador=1;
  26.  set longitud=length(campo);
  27.  
  28. ---------------------------------------------------------------------------------------
  29. --En el while se compara cada posición de la palabra y verifica si tiene acento o no.--
  30. --Si tiene acento, lo cambia. sino tiene acento, lo deja tal como estaba.            --
  31. ---------------------------------------------------------------------------------------
  32.   WHILE longitud >= contador DO    
  33.    if mid(lower(campo),contador,1) = 'á' then
  34.      set campo_aux = 'a';
  35.  
  36.    elseif mid(lower(campo),contador,1) = 'é' then
  37.      set campo_aux = 'e';
  38.  
  39.    elseif mid(lower(campo),contador,1) = 'í' then
  40.      set campo_aux = 'i';
  41.  
  42.    elseif mid(lower(campo),contador,1) = 'ó' then
  43.      set campo_aux = 'o';
  44.  
  45.    elseif mid(lower(campo),contador,1) = 'ú' then
  46.      set campo_aux = 'u';
  47.    else
  48.      set campo_aux = mid(lower(campo),contador,1);
  49.   end if;
  50. ----------------------------------------------------------------
  51. --En campo_mod se va creando la cadena resultante sin acentos.--
  52. --Contador se incrementa para pasar a la siguiente posición.  --
  53. ----------------------------------------------------------------
  54.   set campo_mod = concat(campo_mod,campo_aux);
  55.   set contador = contador + 1;
  56.  end while;
  57.  
  58. return campo_mod;
  59. end$$
  60. delimiter ;

Espero les sirva.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 29/05/2009 a las 08:35