Pesquisa sem diferenciação de acentuação

3 respostas
capelari1337

E aí galera, tenho uma aplicação em java com o postgresql, e preciso que as consultas feitas no mesmo, não diferencie a acentuação, por exemplo : ao pesquisar o nome " jose " quero que retorne tanto “jose”, quanto “josé”. Eu pesquisei algumas maneiras de fazer isso, porém sem sucesso, também existe a possibilidade de usar a extensão UNACCENT, mas há um problema, a empresa que hospeda o banco de dados, não possui esse tipo de serviço, e somente um super usuario pode criar tal extensão, o mesmo não é permitido. Alguém saberia alguma alternativa para resolver tal problema ? o banco está em utf8.

3 Respostas

rodevops

Se vc tem permissão de criar functions no postgre, isso pode te ajudar…

http://www.postgresql-archive.org/Accent-insensitive-search-td1916240.html

Pesquise o post de Thom Brown Mar 18, 2009; 2:24pm ele mostra uma “gambis” marota :joy:

A

Uma outra maneira de fazer isso é normalizar o valor da coluna na própria aplicaçao e manter uma coluna extra no banco usada apenas para pesquisa. Você teria algo como:

nome          nome_pesquisa
José          jose
Jose          jose
Fátima        fatima
Fatima        fatima

Com isso, na hora de pesquisar, se aplicar a mesma funçao de normalizar no texto procurado, você pode fazer a pesquisa nesse campo nome_pesquisa de forma eficiente e sem nenhum trabalho a mais do banco de dados (em troca de mais espaço, que costuma ser barato hoje em dia).

Obs: Repare que você nao precisa do atributo nome_pesquisa na sua classe, pode só criar esse valor na hora de gravar/ler do banco.

capelari1337

Obrigado pela respostas e principalmente pela ajuda @AbelBueno @rodevops , consegui resolver. Para quem estiver passando pelo mesmo problema, utilizei a seguinte função :

CREATE OR REPLACE FUNCTION remove_acento(text)

RETURNS text AS

$BODY$

SELECT TRANSLATE($1,‘áàãâäÁÀÃÂÄéèêëÉÈÊËíìîïÍÌÎÏóòõôöÓÒÕÔÖúùûüÚÙÛÜñÑçÇÿýÝ’,aaaaaAAAAAeeeeEEEEiiiiIIIIoooooOOOOOuuuuUUUUnNcCyyY)

$BODY$

LANGUAGE sql IMMUTABLE STRICT

COST 100;

ALTER FUNCTION remove_acento(text)

OWNER TO postgres;

COMMENT ON FUNCTION remove_acento(text) IS Remove letras com acentuação;

Após criada, chamei ela tanto na entrada quando no valor do banco.

Criado 27 de agosto de 2018
Ultima resposta 28 de ago. de 2018
Respostas 3
Participantes 3