La norme ANSI SQL définit (chapitre 6.5, spécification des fonctions de définition) le comportement suivant pour les fonctions d'agrégation sur des jeux de résultats vides:
COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL
Renvoyer NULL pour AVG, MIN et MAX est parfaitement logique, car la moyenne, le minimum et le maximum d'un ensemble vide ne sont pas définis.
Le dernier, cependant, me dérange: Mathématiquement, la somme d'un ensemble vide est bien défini: 0
. L'utilisation de 0, l' élément neutre de l'addition, comme cas de base rend tout cohérent:
SUM({}) = 0 = 0
SUM({5}) = 5 = 0 + 5
SUM({5, 3}) = 8 = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL
Définir SUM({})
comme null
fait essentiellement "pas de lignes" un cas spécial qui ne correspond pas aux autres:
SUM({}) = NULL = NULL
SUM({5}) = 5 != NULL + 5 (= NULL)
SUM({5, 3}) = 8 != NULL + 5 + 3 (= NULL)
Y a-t-il un avantage évident du choix qui a été fait (SUM étant NULL) que j'ai manqué?