Tag Archives: sql server

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

eliminar acentos oracle

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