C'est une bonne question, et qui n'a pas de bonne réponse. Le traitement de NULL
dans vos deux exemples est différent.
Le problème fondamental est ce que NULL
moyens. Généralement, il est utilisé pour indiquer manquant valeurs. Cependant, dans la norme ANSI, il représente un inconnu évaluer. Je suis sûr que les philosophes pourraient consacrer des tomes à la différence entre "disparu" et "inconnu".
Dans une expression simple (booléenne ou arithmétique ou scalaire d'un autre type), l'ANSI définit le résultat "inconnu" dans presque tous les cas où l'un des opérandes est "inconnu". Il existe quelques exceptions :NULL AND FALSE
est faux et NULL IS NULL
est vrai, mais ceux-ci sont rares.
Pour les opérations d'agrégation, pensez à SUM()
comme "somme de toutes les valeurs connues", et ainsi de suite. SUM()
traite NULL
valeurs différentes de +
. Mais ce comportement est également standard, c'est ainsi que fonctionnent toutes les bases de données.
Si vous voulez un NULL
valeur pour une agrégation quand any de ses opérandes est NULL
, alors vous devez utiliser CASE
. Je pense que le moyen le plus simple pour une seule colonne est :
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)