Battisti – Blog

Tecnologia, Web e um pouco de cultura inútil

battisti On junho - 18 - 2009

O Problema

A língua portuguesa gera diversos problemas para os DBA, um dos mais comuns esta no fato dos usuários querem digitar Joao (sem acento) em uma caixa de busca e querer que o banco localizar o João (com acento), para solucionar este problema no postgres você pode criar uma function que remove os acentos durante as consultas.

A Solução

CREATE OR REPLACE FUNCTION "public"."sem_acentos" (varchar) RETURNS varchar AS
$body$
SELECT TRANSLATE($1, 'áéíóúàèìòùãõâêîôôäëïöüçÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇ', 'aeiouaeiouaoaeiooaeioucAEIOUAEIOUAOAEIOOAEIOUC')
$body$
LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Como Usar

SELECT pss_telefone WHERE sem_acentos(pss_nome) like sem_acentos('%joao%')

Essa consulta irá retornar todos os João, com ou sem acento.

Categories: Postgre, SQL

5 Responses

  1. Em SQL Server esse problema pode ser ultrapassado usando uma COLLATION que seja AI (insensível à acentuação). Não existe algo de equivalente para Postgres?

  2. battisti disse:

    Ainda não encontrei algo nativo para resolver este problema, se alguém tiver uma forma mais interessante posta ai :)

  3. Não te recomendava usar isso para fazer filtros em tabelas grandes, visto que nesse caso ele tem que percorrer todos os campos e “transformá-los” através da função. Quanto muito, se não conseguires uma COLLATION como o Manuel Padilha indica, e muito bem, recomendo mesmo é a teres um campo onde guardes o valor já sem acentos.
    Ocupa mais espaço mas poupa-te muito nos queries :)

  4. battisti disse:

    Essa tbm eh outra solução, estes dias tava fazendo uns “testes” em uma loja virtual e acabei descobrindo que eles tinham na tabela produto um campo chamado nome_sem_acento para resolver este problema

  5. Klawdyo disse:

    no mysql, se estiver com o collate correto, é só fazer o select e pronto

Leave a Reply