В чем разница между "= null" и "IS NULL"? Как они используются по-разному?
Что "= null" и "IS NULL"
Ответ 1
В предложении WHERE
column=null
никогда не будет истинным, неверно использовать null таким образом, вам нужно сказать column IS NULL
или column IS NOT NULL
. Это говорит о особом характере NULL
, это не значение для проверки равенства, это неизвестное значение, поэтому вам нужно использовать синтаксис IS
или IS NOT
.
Вы можете присвоить что-то значение NULL
, используя =
. Например: UPDATE TableX SET Column=NULL...
ссылки:
Wikipedia NUll (SQL)
w3schools Значения SQL NULL
Учебник по SQL, см. раздел "Оператор NULL"
Ответ 2
"= NULL" - выражение ценности Теперь "IS NULL" является предпочтительным методом оценки состояния переменной NULL.
Более подробное обсуждение того же вопроса можно найти в следующей ссылке
http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/
Не уверен, что можно прочитать статью без входа в сайт, поэтому отправьте копию здесь же.
Понимание разницы между "IS NULL" и "= NULL"
Когда переменная создается в SQL с помощью оператора declare, она создается без данных и сохраняется в таблице переменных (vtable) внутри пространства памяти SQL. Vtable содержит имя и адрес памяти переменной. Однако, когда переменная создана, адрес памяти не назначается переменной, и поэтому переменная не определена в терминах памяти.
Когда вы устанавливаете переменную, ей присваивается адрес памяти, и исходные данные сохраняются в этом адресе. Когда вы снова устанавливаете значение, данные в адресе памяти, на которые указывает переменная, затем изменяются на новое значение.
Теперь о различии и почему каждый ведет себя так, как это делается.
"= NULL"
"= NULL" - выражение значения. Значение, если переменная установлена и память создана для хранения данных, она имеет значение. На самом деле переменная может быть установлена в NULL, что означает, что значение данных объектов неизвестно. Если значение установлено так:
DECLARE @val CHAR(4)
SET @val = NULL
Вы явно задали значение данных неизвестным, и поэтому, когда вы делаете:
If @val = NULL
Он будет оцениваться как истинное выражение.
Но если я это сделаю:
DECLARE @val CHAR(4)
If @val = NULL
Он будет оценивать значение false.
Причиной этого является тот факт, что я проверяю значение NULL как значение @val. Поскольку у меня не установлено значение @val, адрес памяти не был назначен, и поэтому для @val не существует значения.
Примечание. См. раздел НАСТРОЙКИ ANSI_NULLS (ВКЛ. ВЫКЛ.) из-за различий в значениях по умолчанию SQL 7 и 2000, которые приводят к тому, что примеры не работают. Это основано на SQL 7.
"NULL"
Теперь "IS NULL" немного сложнее и является предпочтительным методом оценки состояния переменной NULL. Когда вы используете предложение "IS NULL" , он проверяет как адрес переменной, так и данные внутри переменной как неизвестные. Так что если я, например, делаю:
DECLARE @val CHAR(4)
If @val IS NULL
PRINT ‘TRUE’
ELSE
PRINT ‘FALSE’
SET @val = NULL
If @val IS NULL
PRINT ‘TRUE’
ELSE
PRINT ‘FALSE’
Оба выхода будут TRUE. Причина в первом @val IS NULL Я только объявил эту переменную, и адресное пространство для данных не было установлено, для которого "IS NULL" проверяется. А во втором значение явно установлено в NULL, который также проверяет "IS NULL" .
SET ANSI_NULLS (ON | OFF)
Теперь позвольте мне бросить излом в работах. В предыдущих примерах вы видите, что = NULL будет работать до тех пор, пока значение явно задано. Однако, когда вы устанавливаете ANSI_NULLS ON, все будет немного отличаться.
Ex.
DECLARE @val CHAR(4)
SET @val = NULL
SET ANSI_NULLS ON
If @val =NULL
PRINT ‘TRUE’
ELSE
PRINT ‘FALSE’
SET ANSI_NULLS OFF
If @val =NULL
PRINT ‘TRUE’
ELSE
PRINT ‘FALSE’
Вы заметите, что при первом запуске оператора = NULL после выполнения SET ANSI_NULLS ON вы получаете FALSE, а после установки OFF вы получаете TRUE. Причина в следующем.
Выдержка из статьи SQL BOL "SET ANSI_NULLS"
В стандарте SQL-92 требуется, чтобы значение equals (=) или не равное (< > ) сравнение с нулевым значением оценивалось как FALSE. Когда SET ANSI_NULLS ВКЛЮЧЕН, оператор SELECT с использованием WHERE column_name = NULL возвращает нулевые строки, даже если в столбце есть нулевые значения. Оператор SELECT с использованием WHERE column_name < > NULL возвращает нулевые строки, даже если в столбце есть ненулевые значения.
Когда SET ANSI_NULLS выключен, операторы сравнения Equals (=) и Not Equal To (< > ) не следуют стандарту SQL-92. Оператор SELECT с использованием WHERE column_name = NULL возвращает строки с нулевыми значениями в столбце_имя. Оператор SELECT с использованием WHERE column_name < > NULL возвращает строки с ненулевыми значениями в столбце. Кроме того, инструкция SELECT с использованием WHERE column_name < > XYZ_value возвращает все строки, которые не являются значениями XYZ и не являются NULL.
End Excerpt
Так, как определено SQL92, "= NULL" всегда должен оценивать значение false. Поэтому даже установка значения явно означает, что вы никогда не встретите условие = NULL if, и ваш код может работать не так, как предполагалось. Самая большая причина, по которой = NULL будет стрелять вам в ногу, - это то, что SQL 7 при отправке и установке по умолчанию имеет значение ANSI_NULL OFF, но SQL 2000 по умолчанию имеет значение ANSI_NULL ON. Конечно, вы можете изменить это несколько способов, но если вы обновили базу данных с 7 до 2000 и обнаружили, что = NULL работает только тогда, когда вы задаете, если явно при развертывании сервера 2000 по умолчанию ваш код теперь разбивается и может вызвать проблемы с данными.
Еще одна причина использовать IS NULL вместо того, что в соответствии с рекомендациями по SQL 92, по-прежнему будет оцениваться как TRUE, и, следовательно, ваш код будет более безопасным для обновления сервера.
Резюме
Если сводка, если вам не нужно проверять, чтобы значение переменной было равно NULL, и вы установили ANSI_NULLS ON, тогда всегда используйте предложение "IS NULL" , чтобы проверить, является ли переменная NULL. Используя = NULL, вы можете причинить себе массу головных болей, пытаясь устранить проблемы, которые могут возникнуть из-за этого, сейчас или неожиданно в будущем.
базис
Некоторая информация предоставляется из того, как работает С++ и как SQL ведет себя под каждым обстоятельством. К сожалению, SQL, насколько мне известно, не имеет функции addressof, позволяющей мне выводить фактический адрес памяти, чтобы показать, что происходит под капотом. В С++ при создании переменной переменная имеет адрес 0xddddddd (в отладке, но это могут быть и другие нереальные адреса). Когда вы устанавливаете переменную, при первом проверке адреса вы получите действительный адрес памяти, в котором хранятся данные. Кроме того, дополнительную информацию можно получить в электронной документации по SQL в разделах по NULL и SET ANSI_NULLS....
Ответ 3
= NULL
используется для присвоения значения NULL, тогда как IS NULL
используется для определения того, является ли переменная NULL-значной.
Пример sssignment для NULL:
Update TableName Set ColumnName = NULL
Пример сравнения со значением NULL в условном предложении (ссылка):
Select * From TableName Where ColumnName is NULL
ColumnName IS NOT Null
также можно использовать, чтобы удостовериться, что значение не равно NULL.