viernes, 18 de abril de 2008

Creando una funcion postgresql para eliminar acentos y dieresis.

Hola a todos, el motivo que me orillo a desarrollar una funcion para eliminar acentos fue el de simplificar las busquedas de palabras acentuadas en la base de datos postgresql. Hasta la version 8.2 mientras tenia mis esquemas en Latin1 empleaba la funcion to_ascii para este proposito pero actualmente empleando la codificacion UTF8 dicha funcion ya no servia. Asi que me di con la tarea de diseñar una funcioncita para este proposito, y queda asi empleando una funcion SQL y translate:


create or replace function sinacentos (text) returns text AS $$
select translate($1,'áéíóúÁÉÍÓÚäëïöüÄËÏÖÜ','aeiouAEIOUaeiouAEIOU');
$$ language sql;


Un ejemplo con esta funcion quedaria de la siguiente manera:

Primero un simple select de una tabla demo con palabras con acentos:

sicodelico=# select id, otro from foobar;
id | otro ----+--------
1 | algo
2 | algo
3 | algo
4 | algo
2 | algo
5 | México
6 | México
7 | Niño
1 | Mexico
(9 filas)

Ahora la misma consulta procesada con nuestra funcion:

sicodelico=# select id, sinacentos(otro) as otro from foobar;
id | otro
----+------------
1 | algo
2 | algo
3 | algo
4 | algo
2 | algo
5 | Mexico
6 | Mexico
7 | Niño
1 | Mexico
(9 filas)


Ahora una busqueda con el conteo total de las palabras que concuerden con México, MËXICO, MÉXICO, etc...

sicodelico=# select count(*) from foobar where upper(sinacentos(otro)) = upper(sinacentos('méxico'));
count
-------
3
(1 fila)

Con la consulta anterior ya tenemos una forma de buscar entre nuestros registros sin preocuparnos por las palabras que significan lo mismo pero aveces estan escritas sin acento o en mayusculas o minusculas.

--
Saludos.

3 comentarios:

Arcel dijo...

Gracias, yo me estaba inventando una función toda jalada por los pelos... ya veo que la solución fácil normalmente es la mejor

Mario dijo...

gracias! tambien puedes hacer el translate en el select, saludos

Anónimo dijo...

It worked great for cleaning in the bottom of our closets behind boxes.
The lover is found merely behind the consumption port, making the suction required to
get the dust in from your flooring and through the revolving
make sure you brush. You will also need a measuring
tape, electric table saw, rubber mallet and spacers, that
are also offered at the flooring store. Hardwood
flooring in Vancouver, Canada homes is suitable for those that are afflicted by allergies.
It works well on both carpet and hard wood floors.


Here is my webpage best vacuum cleaner for hardwood floors

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo