Boa noite, estou com uma duvida sobre um sql. A questao é a seguinte: Tenho um sistema de busca de imvoeis em um form html com quatro filtros diferentes(operacao, tipo, cidade e dormitorios), mas esses quatro filtros nao serão utilizados todos juntos em todas as pesquisas. por exemplo posso fazer uma pesquisa usando apenas o filtro cidade. Como eu vou fazer o select se eu nao sei quais filtros o usuario vai usar? crio um if para cada possibilidade? ou existe algum valor que passe despercebido pelo banco. Exemplo, se o filtro nao for usado passo um valor, como se fosse o *, que seleciona todos os registros daquele filtro. Entenderam a minha duvida?
Geralmente essa necessidade é chamada de pesquisa dinâmica.
Procure por “sql pesquisa dinâmica” no google se quiser mais detalhes e exemplos.
Em resumo, geralmente você cria sim um if para cada valor.
Geralmente no formato:
if (usuario passou valor de filtro A) adicionoNaQueryFiltroA
if (usuario passou valor de filtro B) adicionoNaQueryFiltroB
Não esqueça de usar sempre PreparedStatement e não concatenar o valor informado pelo usuário com a query em si.
Concordo com o AbelBueno.
Quando eu trabalhava com JDBC, ADO.NET ou qualquer ferramenta que não ORM’s, eu fazia minhas pesquisas dinâmicas dessa forma:
- Para o meu método de pesquisa, eu passava um dicionário de informações relativas à pesquisa;
- Através de cláusulas if, verificava cada uma das possibilidades de pesquisa, e adicionava-as ao PreparedStatement;
- Executava a operação com os filtros que foram adicionados.
Basicamente (exemplo em Java, talvez fique melhor para você entender):
-
No seu evento de pesquisa:
Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("filtroUm", valorUm); parameters.put("filtroDois", valorDois);
2. No meu método de pesquisa:[code]public List pesquisarDinamicamente(Map<String, Object> parameters) {String sentence = “SELECT * FROM TABELA WHERE 1 = 1”;
if (parameters.containsKey(“filtroUm”) {
sentence = String.format("%s AND PARAMETROUM = %s", sentence, parameters.get(“filtroUm”));
}
if (parameters.containsKey(“filtroDois”) {
sentence = String.format("%s AND PARAMETRODOIS = %s", sentence, parameters.get(“filtroDois”));
}
if (parameters.containsKey(“filtroTres”) {
sentence = String.format("%s AND PARAMETROTRES = %s", sentence, parameters.get(“filtroTres”));
}PreparedStatement statement = connection.prepareStatement(sentence);
// faz todo o resto da operação.
}[/code]
Lógico que dá pra aprimorar: usar de forma mais eficiente o PreparedStatement, trocar o uso de concatenação de strings, mas a ideia é basicamente essa.
Espero ter ajudado,
fique com Deus!
ok, a minha ideia de um if para cada alternativa era mais complexa…assim fica mais simples. vlw.Abraços