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


7 Comments

DAM · February 4, 2014 at 11:38 pm

gracias bro

ivan collado · August 8, 2014 at 11:24 am

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

    ArBo_HaCkEr · August 12, 2014 at 6:11 pm

    dentro de la base de datos, sin embargo, lo ideal es que apliques lo que explico en el articulo y es usar el translate directamente en tu query

Manuel · February 9, 2016 at 6:51 am

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.

    arbo · February 9, 2016 at 7:28 pm

    Muchas gracias, ya lo arreglo.

arbo · February 19, 2016 at 2:17 am

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 to DAM Cancel reply

Avatar placeholder

Your email address will not be published. Required fields are marked *