Esta es una buena pregunta, y una que no tiene una buena respuesta. El tratamiento de NULL
en tus dos ejemplos es diferente.
El problema fundamental es qué NULL
medio. Comúnmente, se usa para denotar faltante valores. Sin embargo, en el estándar ANSI, significa un desconocido valor. Estoy seguro de que los filósofos podrían dedicar tomos a la diferencia entre "desaparecido" y "desconocido".
En una expresión simple (booleana, aritmética o escalar de otro tipo), ANSI define el resultado de "desconocido" en casi todos los casos en los que alguno de los operandos es "desconocido". Hay algunas excepciones:NULL AND FALSE
es falso y NULL IS NULL
es cierto, pero estos son raros.
Para las operaciones de agregación, piense en SUM()
como "sumar todos los valores conocidos", y así sucesivamente. SUM()
trata NULL
valores diferentes de +
. Pero este comportamiento también es estándar, así es como funcionan todas las bases de datos.
Si quieres un NULL
valor para una agregación cuando cualquiera de sus operandos es NULL
, entonces necesitas usar CASE
. Creo que la forma más fácil para una sola columna es:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)