Почему «NULL не равен ничему» - ложное утверждение? - PullRequest
0 голосов
/ 01 февраля 2020

Я уверен, что я не понимаю (и, возможно, принимаю) это, но может ли кто-нибудь, пожалуйста, утешить мой смысл?

SELECT IF(NULL != 9, 'TRUE', 'FALSE')

* Извините, если это неподходящее место для этого, но StackOverFlow - первое, что пришло мне в голову для просвещения.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Почти любое сравнение с NULL возвращает NULL. Это потому, что NULL имеет семантику «неизвестное значение», а не «отсутствует».

Если у вас есть сравнение 9 <> NULL, тогда возвращаемое значение равно NULL (для сравнения). * Предложения 1008 *

WHERE обрабатывают значения NULL как "ложные", поэтому строки отфильтровываются. Аналогично, выражения CASE обрабатывают значения NULL как "ложные".

Это не всегда так. CHECK ограничения обрабатывают NULL значения как "true", поэтому проверочное ограничение проходит, даже если значения NULL.

0 голосов
/ 01 февраля 2020

Если вы имеете дело с NULL в базе данных, то вы должны рассматривать выражения как "triinary logi c". Таким образом, логическое значение больше не оценивается до двух значений (как в двоичное ), но до трех:

  • True .
  • Ложь .
  • Нуль : Стандарт SQL не совсем ясен в своем определении, но это может означать полное отсутствие значения, что значение неизвестно или не может быть определено.

Теперь обратите внимание, что ограничение CHECK и предложение WHERE ведут себя по-разному в отношении нулевых значений. Рассмотрим следующий пример:

create table t (
  a int check (a <> 5)
);

insert into t (a) values (1), (2), (null);

Предложение WHERE

Предложение WHERE принимает строку, если предикат (выражение, которое представляет условие) является "истинным"; он отклоняет строку, если предикат оценивается как «false» или «null».

select * from t where a = 1;

Результат:

a
-
1

Как видите, «null» "был исключен из результирующего набора, поскольку предикат a = 1 оценивается как" нулевой ".

Ограничение CHECK

Ограничение CHECK работает немного по-другому чем WHERE. Предикат отклоняется, когда он оценивается только как «ложный»; он принимается, когда он оценивается как «истина», а также «ноль».

Именно поэтому он вставил все три строки, включая значение «ноль».

select * from t;

Результат:

a
----
   1
   2
null

Для значения "null" предикат a <> 5 оценивается как "null", поэтому он был принят и строка вставлена.

0 голосов
/ 01 февраля 2020

NULL в SQL означает, что у него нет значения. Любое значение. Это не меньше, равно или больше, чем любое другое значение.

Итак:

NULL = 9  => null
NULL < 9  => null
NULL <= 9  => null
NULL > 9  => null
NULL >= 9  => null
NULL != 9  => null
NULL = NULL  => null

Что такое TRUE равно value is NULL, если значение равно NULL.

...