Como fazer uma consulta em MySQL retornar 0 no lugar de NULL [ RESOLVIDO ]

Olá amigos. Estou desenvolvendo um sistema para controlar o estoque do almoxarifado. Bolei uma consulta aqui, mas ela retornar o valor NULL, caso não tenha nenhuma saida daquele determinado produto.

String sql = "SELECT e.id as id,p.nome as produto," + " @saida_total:= (SELECT SUM(quantidade) FROM itens_requisicao WHERE produto = e.id) as saidaTotal," + " @entrada_estoque := e.quantidade as entrada,(@entrada_estoque-@saida_total) as emEstoque" + " FROM entrada_estoque e INNER JOIN produto p ON(e.produto = p.id) ORDER BY p.nome";
Ai basicamente ele pega o nome do produto, a saida total, entrada total, acha o que tem no estoque.
Tentei agrupar os produtos pelo nome, somando todas as entradas e saidas destes, ( nesta consulta ele mostra os produtos mais pelo id da entrada_estoque. ) mas como se um produto ainda não teve uma saida registrada ele vai contar como NULL, e não vai aparecer na consulta.
Tem como fazer essa consulta funcionar sem que eu precise fazer um “ajuste técnico”? Obrigado!

Legal a idéia do teu sistema, mostrar o resultado do select direto para o usuário, cara, genial isso.
Por que se fosse do modo arcaico, aquele que pega os dados, trata no java e depois exibe, aí seria horrível. Imagine você ter que verificar campo a campo, registro a registro se o valor é null e definir como 0 para exibição, pensa que ridículo?

Não entendi direito o que você quis dizer ou foi sarcasmo? ‘-’

Já fiz isso que você disse, mais como citei acima, gostaria de saber se tem um modo de fazer no MySQL, porque com essa consulta, se agrupar as somas por nomes ele não irá contar as linhas que contem valores NULL.
Eu sei um pouco sobre lógica, mais não conheço muito bem a linguagem SQL. Como também disse acima … pode ser que exista uma maneira de se fazer isso de uma maneira correta, e não com ajustes no java.

Seu sistema é só o banco e a interface do usuário ou você usa um back end? Se sim, deixa de preguiça e codifica essa verificação, caso venha nulo, defina um valor padrão.

Cara, a verificação tem que ser no mysql porque para agrupar a soma total dos produtos por nome ele não soma um campo com valor NULL.
Já fiz isso aqui …

    public void comboProdutosEmEstoque(List<EmEstoque> listaEmEstoque, JComboBox combo)
      {
        try 
            {
                listaEmEstoque.clear(); combo.removeAllItems();
                
              java.sql.Connection con = Conexao.conectar();
                String sql = "SELECT e.id as id,p.nome as produto,"
                        + " @saida_total:= (SELECT SUM(quantidade) FROM itens_requisicao WHERE produto = e.id) as saidaTotal,"
                        + " @entrada_estoque := e.quantidade as entrada,(@entrada_estoque-@saida_total) as emEstoque"
                        + " FROM entrada_estoque e INNER JOIN produto p ON(e.produto = p.id) ORDER BY p.nome";
                java.sql.PreparedStatement ps = con.prepareStatement(sql);                           
                  java.sql.ResultSet rs = ps.executeQuery();
                  listaEmEstoque.clear();
                  int i = 0;
                  double saida = 0;
                  double entrada = 0;
                  double emEstoque = 0;
                  while(rs.next())                      
                    {
                        saida = rs.getDouble("saidaTotal"); 
                        entrada = rs.getDouble("entrada"); 
                        emEstoque = rs.getDouble("emEstoque"); 
                        if(rs.getString("saidaTotal") == null){
                            saida=0; 
                        }
                            emEstoque = entrada - saida;                        
                        
                        if(emEstoque > 0){
                        listaEmEstoque.add(new EmEstoque(rs.getInt("id"), rs.getString("produto"),entrada, saida, emEstoque));
                        
                        if(listaEmEstoque.get(i).getEmEstoque() > 0){
                            combo.addItem(listaEmEstoque.get(i).getProduto());
                        }      
                        i++;
                        }
                    }    
                      
              rs.close();
              ps.close();
              con.close();               
            } catch (SQLException ex) {
          JOptionPane.showMessageDialog(null, "Erro ao listar produtos para saida ...\nErro: "+ex);
        }                   
      }

Neste trecho listo apenas os produtos que ainda restão pelo menos uma unidade no estoque.
Não é preguiça, apenas quero saber uma maneira correta de se fazer isso no MySQL.

[quote=cembjr]Já fiz isso que você disse, mais como citei acima, gostaria de saber se tem um modo de fazer no MySQL, porque com essa consulta, se agrupar as somas por nomes ele não irá contar as linhas que contem valores NULL.
Eu sei um pouco sobre lógica, mais não conheço muito bem a linguagem SQL. Como também disse acima … pode ser que exista uma maneira de se fazer isso de uma maneira correta, e não com ajustes no java.[/quote]
Maneira correta em que tipo de interpretação? A verdade não é uma equação matemática, onde você soma 1 e 2 e o resultado é 3, ela pode variar de acordo com o ponto de vista.
O que quero dizer é que nem sempre o banco de dados é responsável por toda a lógica.
Programação orientada a banco de dados geralmente é mais penosa, pois, se você precisar alterar a lógica, terá de mexer no banco. Caso você use a estratégia mais acertada e coloque isso no código java, você terá coisas menos complexas para alterar.
Agora, se você quer, você pode verificar se determinado valor é nulo, usando case, por exemplo

SELECT case when coluna1 IS NULL THEN
                  0,
            else
            coluna1
            end AS COL_1
FROM tabela
WHERE id > 0;

Vlww!!! Muito Obrigado!
Eu pensei um pouco aqui e não consegui encontrar uma maneira de tratar esse erro no java, porque o banco me retornava um valor incorreto!!
Muito obrigado denovo drsmachado!!

Sua colocação está confusa.
Agrupar, no meu entender, é usar a cláusula GROUP BY que sequer existe na tua consulta.
Segundo, você tem um INNER JOIN e, a única possibilidade de um registro não ser incluído no select é se e somente se ele não existir na tabela PRODUTO. Se o problema for este, basta trocar o INNER por LEFT.

Então, essa consulta ai faz mostrar os produtos que estão no estoque para o usuario poder dar saida.
Eu queria saber de um jeito pra tipo, adaptar esse ai, tentei com GROUP BY p.nome, mas ele não soma os valores que estão com retorno NULL!
Agora vou tentar colocar aqui e sobrepor esse null por 0, então espero que ele va funcionar certinho!

[quote=cembjr]Então, essa consulta ai faz mostrar os produtos que estão no estoque para o usuario poder dar saida.
Eu queria saber de um jeito pra tipo, adaptar esse ai, tentei com GROUP BY p.nome, mas ele não soma os valores que estão com retorno NULL!
Agora vou tentar colocar aqui e sobrepor esse null por 0, então espero que ele va funcionar certinho![/quote]
Ah sim, o problema é que são subselects e, devido a isso, você tem esse pequeno problema. Agora ficou claro para mim.

Uhuum! Vou tentar colocar o que você postou pra ver se funcionar!

Amigo, acredito que tenha uma maneira mais correta de se fazer isso que você está querendo.
Tente fazer o seguinte:

SELECT IFNULL(campo1,0) as campo1 
FROM tabela

A função IFNULL verifica justamente o retorno do campo, e se for NULL ele muda pro valor que você colocar depois da vírgula (Pode ser String tb)

IFNULL(campo, valor_se_for_null) as campo

Espero ter ajudado qualquer coisa posta aí.
Abraços

1 curtida

Putz ajudou muito luiz_serra!!!
Eu não sabia que o MySQL tinha tantas funções até que resolvi pesquisar para resolver esse problema!!!
Vlw pela idéia!