Select. Consulta com todas palavras de uma frase

9 respostas
F

Salve Pessoal ,

Estou tentando montar umas consultas da seguinte forma:

Quando a pessoa colocar uma frase ela me busca e traz todas as frases que tenho essas palavras

Isso em mysql

Tem alguma ideia?

9 Respostas

A

select * from sua_tabela where lower(campo) like ‘%anatomia%codigo%’

F

Ola,

Valeu pela resposta, mas no caso eu dei um exemplo da frase em si.

Como eu coloco isso dentro da linha do select?(só com comandos)?

Por exemplo eu tenho os campos id, nome, cidade

Eu vou selecionar todas as cidades que tenho essas palavras juntas Mato Grosso.

Entao ele deve me retornar, Mato Grosso, Mato Grosso do Sul

É isso…

A

select id, nome, cidade
from sua_tabela
where lower(cidade) like ‘%mato%grosso%’

A
String valor = meuParametro.replaceAll(" ", "%");
...
"select id, nome, cidade 
from sua_tabela 
where lower(cidade) like '"+ valor +"'";
N

Aqui vai uma ideia meio maluca, mas talvez possa até funcionar…

public static List<SeuBean> pesquisarPorVariasPalavras(String... palavras)
   throws SQLException
{
   //Suponhamos que seu array contenha os seguintes valores: "Mato", "Grosso", "Parana" e "Minas Gerais".

   StringBuilder builder = new StringBuilder();

   for (int I = 0; I < palavras.length; ++I) {

      builder.append("Select ");
      builder.append("T.Id, T.Frase ");
      builder.append("From ");
      builder.append("Tabela T ");
      builder.append("Where ");
      builder.append("Upper(T.Nome) Like '%");
      builder.append(palavras[I].toUpperCase());
      builder.append("%' ");

      if (I < palavras.length - 1) {

         builder.append("Union All ");
      }
   }
            
   Connection connection = ConnectionHelper.getConnection(); // ou qualquer método similar para conexão com Banco de Dados.
   PreparedStatement statement = connection.prepareStatement(builder.toString());
   ResultSet result = statement.executeQuery();
   //...
}

No exemplo acima, sua query deverá ser a seguinte:

Select
   T.Id, T.Frase
From
   Tabela T
Where
   Upper(Nome) Like '%MATO%'

Union All

Select
   T.Id, T.Frase
From
   Tabela T
Where
   Upper(Nome) Like '%GROSSO%'

Union All

Select
   T.Id, T.Frase
From
   Tabela T
Where
   Upper(Nome) Like '%PARANA%'

Union All

Select
   T.Id, T.Frase
From
   Tabela T
Where
   Upper(Nome) Like '%MINAS GERAIS%'

Tente algo parecido, talvez funcione!
Abraços!

P

Nunca ouviste falar em OR ?

N

Nunca ouviste falar em OR ?

É claro que ouvi falar na cláusula OR. Mas o que impede de fazer de um jeito diferente, com UNION ALL, quando o resultado será o mesmo?

P

Nicolas Fernandes:

É claro que ouvi falar na cláusula OR. Mas o que impede de fazer de um jeito diferente, com UNION ALL, quando o resultado será o mesmo?

Nada impede. Fica mais simples usar o OR.
Mas, e dando uma resposta realmente útil, tanto o UNION ALL como o OR são soluções válidas mas que podem ter desempenho muito diferente. E só testando saberá qual será melhor neste caso.

R

Acredito que o caminho mais indicado para o caso é trabalhar com indexação, o Hibernate Search pode ser uma boa saída:
http://www.hibernate.org/subprojects/search.html

Criado 24 de janeiro de 2011
Ultima resposta 26 de jan. de 2011
Respostas 9
Participantes 6