¿Cómo eliminar acentos y caracteres especiales de una consulta de SQL|Oracle?

7
2219
eliminar acentos oracle

El día de hoy se creó la necesidad de devolver el resultado de un campo pero realizando una conversión para omitir los acentos y/o caracteres especiales, teniendo en cuenta que conozco la función replace para realizar este tipo de requerimientos, cree una función como la siguiente:

create function obtiene_nombre(primer_nombre varchar2,
segundo_nombre varchar2, primer_apellido varchar2, segundo_apellido
varchar2)
return varchar2 as
resultado varchar2(21);
begin

resultado:= SUBSTR(NVL(primer_apellido,segundo_apellido) || ' ' || NVL(primer_nombre,segundo_nombre),1,21);

resultado := REPLACE(resultado,'Ñ','N');
resultado := REPLACE(resultado,'á','a');
resultado := REPLACE(resultado,'Á','A');
resultado := REPLACE(resultado,'é','e');
resultado := REPLACE(resultado,'É','E');
resultado := REPLACE(resultado,'í','i');
resultado := REPLACE(resultado,'Í','I');
resultado := REPLACE(resultado,'ó','o');
resultado := REPLACE(resultado,'Ó','O');
resultado := REPLACE(resultado,'ú','u');
resultado := REPLACE(resultado,'Ú','U');
return RPAD(resultado,21);

end;
/

Posteriormente me di a la tarea de probarlo, realizando un query que devolvía un total de 8735 registros y que tenía una duración promedio de 360 milisegundos.

select
count(distinct obtiene_nombre(nombre,nombre2,apellido,apellido2) )
from empleados ;

Sin embargo leyendo en internet, conseguí la función TRANSLATE que se puede decir, agrupa varios replace en uno solo, para realizar algo parecido al función que realice, la forma de utilizarlo sería la siguiente:

select TRANSLATE('niñíto',
'ñáéíóúàèìòùãõâêîôôäëïöüçÑÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇ',
'naeiouaeiouaoaeiooaeioucNAEIOUAEIOUAOAEIOOAEIOUC') remplazo from dual;

Por lo tanto el query para medir el rendimiento de como eliminar acentos oracle quedaría de la siguiente manera

select
count(distinct RPAD( TRANSLATE(SUBSTR(NVL(apellido,apellido2) || ' ' || NVL(nombre,nombre2),1,21),'ñáéíóúàèìòùãõâêîôôäëïöüçÑÁÉÍÓÚÀÈÌÒÙÃÕÊÎÔÛÄËÏÖÜÇ', 'naeiouaeiouaoaeiooaeioucNAEIOUAEIOUAOAEIOOAEIOUC'),21) )
from empleados ;

Ofreciéndome los siguientes resultados:

  • El tiempo promedio de respuesta había bajado a 111 milisegundos
  • No se tuvo que desarrollar una función nueva
  • El código se redujo considerablemente

Nota: si están interesados en usar la función TRANSLATE en SQL Server (t-sql), les comento que la misma no existe, pero existen versiones creadas por gente de la comunidad para facilidad de los programadores. Pueden encontrar varias en el siguiente link: Translate en t-sql

Comments

comments

7 COMMENTS

  1. hola, donde creaste la funcion? estoy trabajando con php y oracle recien aprendiendo y tengo este problema en una busqueda que compara cadenas

  2. Buenas,
    Buen articulo, quería comentarte que el translate tienes más letras en la segunda parte que en la primera, tienes duplicada una O que debería ser una U en el Û y luego tienes una A que debería quitarse ya que le correspondería al Ê

    Un saludo.

  3. Dado que no existe la función translate para sql server, les agregue un link donde pueden encontrar funciones hechas por la comunidad para emular esta util función en sql server (t-sql)

Leave a Reply