COALESCE: como tratar o NULL sem fingir que ele é zero
Você soma uma coluna, o total vem menor do que deveria. Ou pior: uma conta inteira volta como NULL, sem erro nenhum.
Quase sempre é a mesma causa. NULL não é zero — é desconhecido. E desconhecido contamina tudo que encosta nele.
O NULL contamina a conta
SELECT 100 + NULL -- resultado: NULL
Não é 100. Faz sentido: se você não sabe quanto vale a segunda parcela, não sabe o total. Qualquer operação aritmética com NULL devolve NULL.
O mesmo vale para concatenar texto, e é aí que aparece o clássico do relatório com o campo inteiro em branco:
SELECT nome || ' - ' || apelido AS identificacao
FROM clientes
Um cliente sem apelido não fica “João - ”. Fica NULL, e o nome some também.
O que o COALESCE faz
COALESCE recebe vários valores e devolve o primeiro que não for NULL:
SELECT COALESCE(apelido, nome, 'sem cadastro') AS exibicao
FROM clientes
Tem apelido? Usa o apelido. Não tem? Cai para o nome. Não tem nenhum dos dois? 'sem cadastro'.
Aplicado no problema de cima:
SELECT nome || ' - ' || COALESCE(apelido, 'sem apelido') AS identificacao
FROM clientes
O cuidado que quase ninguém toma
Trocar NULL por zero muda o número — e nem sempre você quer isso.
Repare na diferença:
SELECT AVG(nota) FROM avaliacoes -- ignora os NULL
SELECT AVG(COALESCE(nota, 0)) FROM avaliacoes -- conta os NULL como nota zero
A primeira responde “a média de quem avaliou”. A segunda responde “a média tratando quem não avaliou como nota zero” — o que despenca a média e provavelmente não é o que o negócio quis perguntar.
Não é que uma esteja errada. São perguntas diferentes, e é você quem escolhe qual está respondendo.
Pra lembrar
Antes de sair colocando COALESCE(x, 0) em tudo, responda: “não tem valor” é a mesma coisa que “vale zero”?
- Cliente sem pedido no mês → faturou zero.
COALESCEpara zero está certo. - Cliente que não respondeu a pesquisa → não deu nota zero. Aí o certo é deixar
NULLe ignorar.
NULL é ausência de informação. Zero é uma informação. Confundir os dois é como o número errado entra silenciosamente no relatório.