Я понимаю, почему null + 1
или (1 + null
) возвращает null
: null
означает "неизвестное значение", а если значение неизвестно, его преемник также неизвестен. То же самое верно для большинства других операций с нулевым значением. [*]
Однако я не понимаю, почему происходит следующее:
SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0
Этот запрос возвращает null
. Зачем? Здесь нет никаких неизвестных значений! Предложение WHERE возвращает нулевые записи, а сумма пустого набора значений 0
. [**] Обратите внимание, что набор не является неизвестным, он, как известно, пуст.
Я знаю, что я могу обойти это поведение, используя ISNULL
или COALESCE
, но я пытаюсь понять, почему это поведение, которое кажется мне интригующим, было выбрано.
Можно ли понять, почему это имеет смысл?
[*] с некоторыми заметными исключениями, такими как null OR true
, где, очевидно, true
является правильным результатом, поскольку неизвестное значение просто не имеет значения.
[**] точно так же, как произведение пустого набора значений 1
. Математически говоря, если бы я должен был расширять $(Z, +) $до $(Z union {null}, +) $, то очевидный выбор для единицы идентичности все равно был бы 0
, а не null
, так как x + 0 = x
но x + null = null
.