GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Consulta sql com 3 parâmetros: duas datas + outra coluna [Resolvido]

postgresql
sql
Tags: #<Tag:0x00007fdbd0c2c370> #<Tag:0x00007fdbd0c2c1e0>

#1

pessoal,

Estou com a seguinte questão… Tenho que fazer um Select para apresentar os dados de um relatório de vendas; que no caso tem que possuir os seguintes parâmetros: Data Inicial, Data Final e a Forma de Pagamento para apresentar o relatório. Quanto a busca somente com data inicial e final, eu consegui fazer o select
Que no caso é este: SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’)

Mas agora tenho que adicionar a minha coluna formaPagamento que tem as opções de dinheiro, débito e crédito para ser filtrada também conforme a escolha dentre as três formas para pagar.
Precisando de mais informações para me ajudarem, só pedir!
Agradeço a ajuda!


#2

Isso não resolve?

... AND formaPagamento = ?

vc está usando alguma linguagem de programação pra colocar ? no lugar dos filtros, algo que evite SQL injection é isso?

ou ? faz parte da sintaxe do postgres? (não conheço postgres a fundo por isso minha dúvida)


#3

então, eu estou usando java, e esta dessa maneira na minha JDBC para acessar o banco de dados e apresentar as informações.

    public ArrayList<Venda> buscarVendaData(Venda dataI, Venda dataF) {
    
    ArrayList<Venda> listaParaRetorno = new ArrayList<>();
    
    try {
        String sql = "SELECT * FROM tb_venda WHERE (data,'%d-%m-%Y') BETWEEN (?,'%d-%m-%Y') AND (?,'%d-%m-%Y')";
        PreparedStatement preparacaoDaInstrucao = Conexao.retornaConexao().prepareStatement(sql);
        
        preparacaoDaInstrucao.setString(1,dataI.getData());
        preparacaoDaInstrucao.setString(2,dataF.getData());
        
                
        ResultSet resultado = preparacaoDaInstrucao.executeQuery();
     
        while (resultado.next()) {
            Venda venda = transformaResultSetEmObjeto(resultado);
            listaParaRetorno.add(venda);
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }

    return listaParaRetorno;
   
}

ja havia feito o teste colocando mais um AND como vc falou:

String sql = “SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’) AND formaPagamento = ?”;

mas aí me apresente este erro:

org.postgresql.util.PSQLException: ERROR: column “formapagamento” does not exist
Dica: Perhaps you meant to reference the column “tb_venda.formaPagamento”.

segui essa dica do erro tb alterando o nome, mas não consegui resultado (ou eu que não entendi ela tb hehe)


#4

De acordo com o erro a coluna formaPagamento não existe na tb_venda, por este motivo ele apresenta o erro.


#5

Não faz parte da sintaxe do postgres, provavelmente ele tenha feito para evitar SQL Injection.


#6

Sim, exatamente. Fiz para evitar SQL injection!


#7

então, a partir desse erro é o que dá-se a entender. Mas a coluna existe sim.
Verifiquei a forma da escrita tb para ver se estão iguais, mudei o nome da coluna tb. Mas realmente não esta dando certo.
Mas para tirar a dúvida mesmo… esta seria a forma correta de eu fazer esse filtro entre as duas datas e a coluna forma de pagamento ?
String sql = “SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’) AND formaPagamento = ?”;

ou não, ainda possui erro ?

Obrigado


#8

A Query está correta, a maneira de escrita seria essa mesma, aplicar todos os sets para os parâmetros e em tese deveria funcionar, não sei te dizer quanto ao uso disso: (?,’%d-%m-%Y’), pois nunca cheguei a utilizar.
Tenta executar essa sua query diretamente no PgAdmin e veja se obtem o retorno desejado, desta forma já consegue tirar a prova real do resultado.


#9

Pessoal, consegui resolver.

o motivo era justamente a escrita do nome da coluna. esta assim formaPagamento, mas o PostgreSQL não reconhece letras maiúsculas para o nome da coluna, coloquei tudo em minúscula, alterei os get e set do código tb e deu certo.
Cada coisa simples dessa que da umas dor de cabeça nada a ver.
Muito obrigado a atenção de cada um!

para caso de mais alguém precisar… O select é dessa maneira mesmo:
String sql = “SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’) AND formapagamento = ?”;

apenas tudo me minúsculo nos nomes das colunas do banco.


#10

O postgres por si só não faz essa distinção da sintaxe entre maiúsculas e minúsculas, se não me falha a memória basta colocar a coluna entre aspas duplas para que o mesmo ignore as letras maiúsculas e minúsculas e obtenha o mesmo resultado.


#11

Entendi!
Depois irei fazer o teste assim tb. E ja tiro a prova e sano mais dúvidas quanto ao uso dessas consultas no postgre
Obrigado!


#12

Foi o que imaginei, mas na duvida melhor perguntar…