Valor "nulo" do select para o banco de dados

3 respostas
DBR

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?

3 Respostas

A

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.

Nicolas_Fernandes

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:

1. Para o meu método de pesquisa, eu passava um dicionário de informações relativas à pesquisa;
2. Através de cláusulas if, verificava cada uma das possibilidades de pesquisa, e adicionava-as ao PreparedStatement;
3. Executava a operação com os filtros que foram adicionados.

Basicamente (exemplo em Java, talvez fique melhor para você entender):

1. 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:
public List<Classe> 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.
}
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! :D

DBR

ok, a minha ideia de um if para cada alternativa era mais complexa…assim fica mais simples. vlw.Abraços

Criado 3 de abril de 2013
Ultima resposta 3 de abr. de 2013
Respostas 3
Participantes 3