2010-05-01 2 views

ответ

6

= NULL используется для присвоения значению NULL, тогда как IS NULL используется для определения значения переменной NULL.

Пример sssignment в NULL:

Update TableName Set ColumnName = NULL 

Пример сравнения с значением NULL в условной пункте (link):

Select * From TableName Where ColumnName is NULL 

ColumnName IS NOT Null также может быть использован, чтобы убедиться, что значение не-NULL.

31

В статье WHERE, column=null никогда не будет правдой, это не является допустимым использовать нулевой таким образом, вы должны сказать column IS NULL или column IS NOT NULL. Это говорит о специальном характере NULL, это не значение для проверки на равенство, это неизвестное значение, поэтому вам нужно использовать синтаксис или IS NOT.

Вы можете присвоить что-то значение NULL с использованием = равным. Например: UPDATE TableX SET Column=NULL...

ссылки:
Wikipedia NUll (SQL)
w3schools SQL NULL Values
SQL Tutorial, see IS NULL Operator section

+1

Повторяющийся ответ? –

+0

Не «будет», а «должен». (К сожалению.) Как показывает этот гигантский c-n-p из какого-либо другого сайта, по крайней мере одна SQL-система позволяет ему работать (в основном). –

+1

Просто чтобы быть технически корректным, null - это отсутствие значения, а не неизвестное значение. –

14

«= NULL,» является выражением значения Теперь «IS NULL» является предпочтительным способом для оценки состояния переменной NULL.

Более подробное обсуждение по этому же вопросу можно найти в следующей ссылке

http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/

Не уверен, что, если можно прочитать статью без регистрации на сайте, чтобы разместить копирование того же здесь

Понимание разницы между «IS NULL» и «= NULL»

Когда переменная создается в SQL с помощью оператора объявления, она создается без данных и сохраняется в переменная table (vtable) внутри пространства памяти SQL. Vtable содержит имя и адрес памяти переменной. Однако, когда переменная создана, адрес памяти не назначается переменной, и поэтому переменная не определяется в терминах памяти.

Когда вы устанавливаете переменную, ей присваивается адрес памяти, и исходные данные сохраняются в этом адресе. Когда вы снова устанавливаете значение, данные в адресе памяти, на которые указывает переменная, затем изменяются на новое значение.

Теперь о различиях и почему каждый ведет себя так, как он делает.

«= NULL»

«= NULL» является выражением стоимости.Значение, если переменная установлена ​​и память создана для хранения данных, она имеет значение. На самом деле переменная может быть установлена ​​в NULL, что означает, что значение данных объектов неизвестно. Если значение было установлено следующим образом:

DECLARE @val CHAR(4) 



SET @val = NULL 

Вы явно задать значение данных, неизвестно, и поэтому, когда вы делаете:

If @val = NULL 

Он будет оценивать как истинное выражение.

Но если я:

DECLARE @val CHAR(4) 



If @val = NULL 

Он оценит ложь.

Причина этого заключается в том, что я проверяю значение NULL как значение @val. Поскольку у меня не установлено значение @val, адрес памяти не был назначен, и поэтому для @val не существует значения.

Примечание: См. Раздел «НАСТРОЙКИ ANSI_NULLS (ON | OFF)» из-за различий в значениях по умолчанию SQL 7 и 2000, которые приводят к тому, что примеры не работают. Это основано на SQL 7.

«IS 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’ 

Оба выхода будут ИСТИНА. Причина в первом @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 вы получаете ЛОЖЬ и после установки OFF вы получите TRUE. Причина в следующем.

Выдержка из статьи SQL-BOL «SET ANSI_NULLS»

Стандарт SQL-92 требует, чтобы равенства (=) или не равны (<>) по сравнению с нулевым значением имеет значение 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.

Конец Отрывок

Так как определено SQL92, «= NULL» должен всегда оценивать ложь. Поэтому даже установка значения явно означает, что вы никогда не встретите условие = 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, вы можете вызвать у себя много головных болей, пытаясь устранить проблемы, которые могут возникнуть из-за этого, теперь или неожиданно в будущем.

Основа

Некоторые из информации приходит от того, как работает C++ и как SQL ведет себя при каждом обстоятельстве. К сожалению, SQL, насколько мне известно, не имеет функции addressof, позволяющей мне выводить фактический адрес памяти, чтобы показать, что происходит под капотом. В C++ при создании переменной переменная имеет адрес 0xddddddd (в отладке, но это могут быть и другие нереальные адреса). Когда вы устанавливаете переменную, при первом проверке адреса вы получите действительный адрес памяти, в котором хранятся данные. Кроме того, дополнительную информацию можно получить в электронной документации по SQL в разделах по NULL и SET ANSI_NULLS ....

+0

большое спасибо за ваш полный ответ! – user329820

+0

вы бы больше объяснили примечание, которое было написано выше после части «= null» – user329820