Проблема в том, что NULL не считается равным чему-либо, даже не самому себе, но странная часть в том, что он также не не равен самому себе.
Рассмотрим следующееоператоры (что, кстати, недопустимо в T-SQL для SQL Server, но допустимо в My-SQL, однако это то, что ANSI определяет для нуля, и может быть проверено даже в SQL Server с помощью операторов case и т. д.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Таким образом, нет правильного / ложного ответа на вопрос, вместо этого ответ также нулевой.
Это имеет много последствий, напримерв
- операторах CASE, в которых любое нулевое значение всегда будет использовать предложение ELSE, если только вы явно не используете условие WHEN IS NULL ( NOT условие
WHEN NULL
) - Конкатенация строк, как
SELECT a + NULL -- Results in NULL
- В выражении WHERE IN или WHERE NOT IN, как если вы хотите получить правильные результаты, убедитесь, что в коррелированном подзапросеотфильтровать все нулевые значения.
Oneможно переопределить это поведение в SQL Server, указав SET ANSI_NULLS OFF
, однако это НЕ рекомендуется и не должно выполняться, поскольку это может вызвать много проблем, просто из-за отклонения от стандарта.
(Как примечание, в My-SQL есть возможность использовать специальный оператор <=>
для нулевого сравнения.)
Для сравнения, в общих языках программирования ноль обрабатывается как обычное значение и равенСамо по себе, однако, это значение NAN, которое также не равно самому себе, но, по крайней мере, возвращает «ложь» при сравнении его с самим собой (и при проверке на «не равно» разные языки программирования имеют разные реализации).
Обратите внимание, однако, что в базовых языках (т.е. VB и т. Д.) Нет ключевого слова «null», и вместо этого используется ключевое слово «Nothing», которое нельзя использовать при прямом сравнении, а вместо этого необходимо использовать «IS», как в SQLоднако он фактически равен самому себе (при использовании косвенных сравнений).