Busca desconsiderando acentuação.  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
rodolfodev
JavaBaby
[Avatar]

Membro desde: 29/03/2006 16:09:17
Mensagens: 92
Offline

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?
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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".
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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
[WWW]
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

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

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
okara
JavaTeenager

Membro desde: 16/05/2005 08:47:08
Mensagens: 152
Offline

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
JavaBaby
[Avatar]

Membro desde: 29/03/2006 16:09:17
Mensagens: 92
Offline

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
Entusiasta Java

Membro desde: 09/06/2006 15:21:48
Mensagens: 18
Offline

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
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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).

[WWW]
btafarelo
JavaChild

Membro desde: 09/06/2006 18:37:18
Mensagens: 135
Localização: São Paulo
Offline

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);
}

}

---
Abs,

Bruno Tafarelo
David
JavaEvangelist
[Avatar]

Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline

No postgres:

David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica
[WWW]
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team