Busca desconsiderando acentuação

9 respostas
rodolfodev

Estou precisando fazer uma busca no Banco de Dados que me desconsidere acentução.

Exemplo:
Busca pela palavra [solução]. quero que me encontre se estiver [solucao] ou [soluçao].

Alguem tem uma idéia?

9 Respostas

T

Depende de seu banco. Exemplo:

Oracle 10g - é um recurso novo:

Operations inside an Oracle database are always sensitive to the case and the
accents (diacritics) of the characters. Sometimes you may need to perform case-
insensitive or accent-insensitive comparisons and sorts. You could call functions
LOWER/UPPER to make SQL statements case-insensitive but this can cause
performance degradation. The new case and accent insensitive searching
introduced in Oracle Database 10g is the best of all worlds as it can be applied to
any linguistic sort, it won’t degrade performance and it allows customers to have
the same SQL behaviors without changing existing code. Just like for linguistic
sorts, a function-based index can be built to improve the performance of case-
insensitive searches.

SQL Server - quando você cria o banco ou a tabela (ou instala o servidor em versões mais antigas) você tem a opção de usar busca que depende ou não da acentuação e do “case”.

T

Outra forma (que obviamente viola a normalização de bancos de dados) é ter para cada coluna que requer esse tipo de pesquisa uma coluna que está em maiúscula e sem acentos.

NOME
Gisele Bündchen
NOME_NORM
GISELE BUNDCHEN

peczenyj

http://forumweb.com.br/artigos/artigos.php?action=file&id=350

O

Se você fizer um assim:

buscar a palavra
solução

select * from busca where palavra in (‘solução’,‘soluçao’,‘solucao’)

é só montar uma algorítimo para automatizar.

rodolfodev

Valeu, Estou usando o DB2, o pessoal aki tá querendo usar esse de replica de coluna mas vou dar uma estuda.

Acho que se criar uma funçao que retire acentução com replace pode funcinar mais tenho que ver se não perde muito a performance.

Nova sugestões são sempre bem-vindas.

celiomarcos

Acho (não tenho certeza) que o SQL do DB2 também deveria permitir o uso de coringas (Wild cards) no LIKE. É utilizado o caractere ‘%’ e o ‘_’.
Por exemplo:
Existindo estas rows na tabela ‘cidadesrs’ dbteste:
“GRAMADO”
“GRAVATAÍ”
“OSÓRIO”

SELECT name FROM cidadesrs
WHERE name LIKE ‘GRA%’
Retornara:
“GRAMADO”
“GRAVATAÍ”

SELECT name FROM cidadesrs
WHERE name LIKE ‘OS_RIO’
Deveria retornar:
“OSÓRIO”

Sendo verdadeiro a possivibilidade de usar os coringas faça uma rotina para alterar os acentos pelo ‘_’

E diga ae se resolveu teu problema :wink:

T

Se a versão do DB2 for muito antiga, não suporta “Collation Order”, então não daria para fazer algo parecido com o que é possível com o SQL Server.

Nesse caso é melhor ter a réplica de coluna. (É um porre se for para muitas colunas e muitas tabelas).

Usar “LIKE” pode funcionar com tabelas pequenas mas não com tabelas grandes. (Algumas cláusulas de LIKE, principalmente quando o wildcard está no começo da string, acabam se transformando em um “table scan” - pesadelo de qualquer DBA que se preze).

B

Rodolfo,

Procure na documentação do DB2, como implementar expressões regulares,

com elas vc poderá implmentar isso com muita facilidade.

Exemplo de expressão em java:

import java.util.regex.Pattern;

public class RegExp {

public static void main(String[] args) {
	String regExp = "solu[cç][aã]o";
	
	boolean result = Pattern.matches(regExp, "soluçao");
	
	System.out.println(result);
}

}

David

No postgres:

select * from pessoa where to_ascii(nome) like to_ascii('solução')
Criado 9 de junho de 2006
Ultima resposta 9 de jun. de 2006
Respostas 9
Participantes 7