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.

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo