Возможный дубликат:
что такое "= 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 проясняет ситуацию.