Стандарт ANSI SQL определяет (глава 6.5, спецификация функции набора) следующее поведение для агрегатных функций в пустых результирующих наборах:
COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL
Возврат NULL для AVG, MIN и MAX имеет смысл, поскольку среднее, минимальное и максимальное значения пустого набора не определены.
Последний, однако, беспокоит меня: Математически SUM пустого множества хорошо определен: 0
. Использование 0, нейтрального элемента сложения, в качестве базового варианта делает все согласованным:
SUM({}) = 0 = 0
SUM({5}) = 5 = 0 + 5
SUM({5, 3}) = 8 = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL
Определение SUM({})
as в null
основном делает «без строк» особым случаем, который не вписывается в другие:
SUM({}) = NULL = NULL
SUM({5}) = 5 != NULL + 5 (= NULL)
SUM({5, 3}) = 8 != NULL + 5 + 3 (= NULL)
Есть ли какое-то очевидное преимущество сделанного выбора (SUM, NULL), который я пропустил?