什么是“= null”和“IS NULL”
“= null”和“IS NULL”有什么区别? 他们是如何使用不同的?
在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教程,请参阅IS NULL操作符部分
“= NULL”是值的expression现在“IS NULL”是评估variables的条件是NULL的首选方法。
关于同一个问题的更详细的讨论可以在下面的链接中find
http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/
不确定是否可以在不login网站的情况下阅读文章,以便在这里发布复制
了解“IS NULL”和“= NULL”之间的区别
当使用declare语句在SQL中创buildvariables时,将创build一个没有数据的variables,并将其存储在SQL内存空间中的variables表(vtable)中。 vtable包含variables的名称和内存地址。 但是,当variables被创build时,没有内存地址被分配给variables,因此variables没有被定义为内存。
当您设置variables时,会分配一个内存地址,并将初始数据存储在该地址中。 当您再次设置该值时,variables所指向的内存地址中的数据将被更改为新值。
现在有差别,为什么每个人的行为如此。
“= NULL”
“= NULL”是值的expression式。 意思是说,如果已经设置了variables并且创build了用于存储数据的内存,则它具有值。 一个variables实际上可以设置为NULL,这意味着对象的数据值是未知的。 如果这个值已经这样设置:
DECLARE @val CHAR(4) SET @val = NULL
你已经明确地将数据的值设置为未知,所以当你这样做的时候:
If @val = NULL
它将评估为一个真实的expression。
但是,如果我这样做:
DECLARE @val CHAR(4) If @val = NULL
它会评估为false。
这是因为我正在检查NULL作为@val的值的事实。 由于我没有设置@val的值,因此没有分配内存地址,因此@val不存在任何值。
注意:由于SQL 7和2000默认值的不同导致示例不起作用,请参见有关SET ANSI_NULLS(ON | OFF)的部分。 这是基于SQL 7的。
“IS NULL”
现在“IS NULL”是一个小技巧,是评估variables的条件为NULL的首选方法。 当使用“IS NULL”子句时,它将检查variables的地址和variables中的数据是未知的。 所以,如果我举个例子:
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我只声明了variables和数据的地址空间没有设置“IS NULL”检查。 而在第二个值已被明确设置为NULL这“IS NULL”检查也。
SET ANSI_NULLS(ON | OFF)
现在让我在作品中扭曲一下。 在前面的例子中,只要显式设置值,就会看到= NULL。 但是,当你设置ANSI_NULLS ON时,事情会有一些不同。
防爆。
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'
在SET SET_NULLS ON之后,你会首次运行= NULL语句,你会得到一个FALSE,在设置OFF之后你会得到一个TRUE。 原因如下。
摘自SQL BOL文章“SET ANSI_NULLS”
SQL-92标准要求等于(=)或不等于(<>)的空值比较结果为FALSE。 当SET ANSI_NULLS为ON时,即使column_name中存在空值,使用WHERE column_name = NULL的SELECT语句也会返回零行。 即使列名中有非空值,使用WHERE column_name <> NULL的SELECT语句也会返回零行。
当SET ANSI_NULLS为OFF时,Equals(=)和Not Equal To(<>)比较运算符不遵循SQL-92标准。 使用WHERE column_name = NULL的SELECT语句将返回column_name中具有空值的行。 使用WHERE column_name <> NULL的SELECT语句将返回列中具有非空值的行。 另外,使用WHERE column_name <> XYZ_value的SELECT语句将返回非XYZ值且不为NULL的所有行。
结束摘录
所以正如SQL92所定义的那样,“= NULL”应该总是为false。 所以,即使明确地设置值,也意味着如果条件和代码可能无法按预期工作,则永远不会满足= NULL。 其中= NULL的最大原因就是你的脚是这样的,SQL 7在发货和安装时默认为ANSI_NULL OFF,但SQL 2000默认为ANSI_NULL ON。 当然,你可以改变这几种方式,但是如果你将数据库从7升级到2000,并且发现只有在你明确地设置了默认2000服务器的情况下设置了= NULL,你的代码才会崩溃,并且会导致数据问题。
还有另一个使用IS NULL的理由,因为在SQL 92的指导下,它仍然要评估为TRUE,因此你的代码更安全的升级服务器。
概要
如果汇总除非需要检查variables的值是否设置为等于NULL并且已将ANSI_NULLS设置为ON,则始终使用“IS NULL”子句来validationvariables是否为NULL。 通过使用= NULL,您可以在试图解决现在或未来意想不到的可能出现的问题时,引起很多头痛。
基础
一些提供的信息来自C ++的工作原理以及SQL在每种情况下的行为方式。 不幸的是,据我所知,SQL没有addressof函数来允许我输出实际的内存地址来显示底层的内容。 在C ++中创buildvariables时,variables的地址为0xddddddd(在debugging中,但也可以是不同的非实地址)。 当您设置variables时,首次检查地址将为您提供存储数据的有效内存地址。 此外,可以从SQL联机丛书的IS NULL和SET ANSI_NULLS …部分获取更多的信息。
= NULL
用于赋值为NULL值,而IS NULL
用于确定variables是否为NULL值。
调配为NULL的示例:
Update TableName Set ColumnName = NULL
与条件子句中的NULL值比较的示例( 链接 ):
Select * From TableName Where ColumnName is NULL
ColumnName IS NOT Null
也可以用来确保一个值是非NULL。