Что "= 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.