Возможный дубликат:
что такое "= null" и "IS NULL"
Есть ли разница между IS NULL и = NULL
В чем разница между
where x is null
и
where x = null
и почему последние не работают?
Возможный дубликат:
что такое "= null" и "IS NULL"
Есть ли разница между IS NULL и = NULL
В чем разница между
where x is null
и
where x = null
и почему последние не работают?
В SQL сравнение между значением null
и любым другим значением (включая другое null
) с использованием оператора сравнения (например, =
, !=
, <
и т.д.) Приведет к null
, который рассматривается как false
для целей предложения where (строго говоря, это "не правда", а не "ложь", но эффект тот же).
Причина заключается в том, что null
означает "неизвестный", поэтому результат любого сравнения с null
также "неизвестен". Таким образом, вы не получите удар по строкам, если закодируете where my_column = null
.
SQL предоставляет специальный синтаксис для проверки, если столбцом является null
, через is null
и is not null
, что является специальным условием для проверки для null
(или нет null
).
Вот некоторые SQL, показывающие различные условия и их влияние, как указано выше.
create table t (x int, y int);
insert into t values (null, null), (null, 1), (1, 1);
select 'x = null' as test , x, y from t where x = null
union all
select 'x != null', x, y from t where x != null
union all
select 'not (x = null)', x, y from t where not (x = null)
union all
select 'x = y', x, y from t where x = y
union all
select 'not (x = y)', x, y from t where not (x = y);
возвращает только 1 строку (как и ожидалось):
TEST X Y
x = y 1 1
Посмотрите, как работает SQLFiddle
Важно отметить, что NULL не равно NULL.
NULL
не является значением и поэтому не может сравниться с другим значением.
where x is null
проверяет, является ли x нулевым значением.
where x = null
проверяет, равен ли x равному NULL, который никогда не будет истинным
Сначала правильный способ проверить, является ли значение поля null
, а позже не будет работать так, как вы ожидаете, потому что null
- это особое значение, которое не равно никому, поэтому вы не можете использовать сравнение равенства используя =
для него.
Поэтому, когда вам нужно проверить, является ли значение поля null
или нет, используйте:
where x is null
вместо:
where x = null
Я думаю, что равенство - это то, что может быть абсолютно определено. Проблема с null
в том, что он по сути неизвестен. Null
в сочетании с любым другим значением является null
- неизвестно. Запрашиваемая SQL "Мое значение равно null
?" будет неизвестен каждый раз, даже если ввод null
. Я думаю, что реализация IS NULL
проясняет ситуацию.