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