Esta é uma boa pergunta, e que não tem uma boa resposta. O tratamento de
NULL
em seus dois exemplos é diferente. O problema fundamental é o que
NULL
significa. Comumente, é usado para denotar ausente valores. No entanto, no padrão ANSI, significa um desconhecido valor. Tenho certeza de que os filósofos poderiam dedicar tomos à diferença entre "desaparecido" e "desconhecido". Em uma expressão simples (booleana ou aritmética ou escalar de outro tipo), o ANSI define o resultado como "desconhecido" em quase todos os casos em que qualquer um dos operandos é "desconhecido". Existem algumas exceções:
NULL AND FALSE
é falso e NULL IS NULL
é verdade, mas estes são raros. Para as operações de agregação, pense em
SUM()
como "soma todos os valores conhecidos", e assim por diante. SUM()
trata NULL
valores diferentes de +
. Mas, esse comportamento também é padrão, então é assim que todos os bancos de dados funcionam. Se você quer um
NULL
valor para uma agregação quando qualquer de seus operandos é NULL
, então você precisa usar CASE
. Acho que a maneira mais fácil para uma única coluna é:(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)