ano*_*ser 38
在一个WHERE子句中,column=null永远不会是真的,这种方式使用null是无效的,你需要说column IS NULL或者column IS NOT NULL.这说明了它的特殊性NULL,它不是检查相等性的值,它是一个未知值,所以你需要使用IS或IS NOT语法.
您可以NULL使用=相等的值分配值.例如:UPDATE TableX SET Column=NULL...
链接:
维基百科NUll(SQL)
w3schools SQL NULL值
SQL教程,请参阅IS NULL运算符部分
Pha*_* PV 18
"= NULL"是值的表达式现在,"IS NULL" 是用于评估变量条件为NULL的首选方法.
有关同一问题的更详细讨论可在以下链接中找到
http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/
不确定是否可以在不登录网站的情况下阅读文章,因此在此处发布相同的复制内容
理解"IS NULL"和"= NULL"之间的区别
当使用declare语句在SQL中创建变量时,它将在没有数据的情况下创建,并存储在SQLs内存空间内的变量表(vtable)中.vtable包含变量的名称和内存地址.但是,当创建变量时,没有为变量分配内存地址,因此变量不是根据内存定义的.
设置变量时,会分配一个存储器地址,初始数据存储在该地址中.再次设置该值时,变量指向的内存地址中的数据将更改为新值.
现在为了区别,为什么每个人的行为方式都如此.
"= NULL"
"= NULL"是值的表达式.意思是,如果已设置变量并为存储数据创建了内存,则它具有值.事实上,变量可以设置为NULL,这意味着对象的数据值是未知的.如果值设置如下:
DECLARE @val CHAR(4)
SET @val = NULL
Run Code Online (Sandbox Code Playgroud)
您已明确将数据值设置为unknown,因此当您执行以下操作时:
If @val = NULL
Run Code Online (Sandbox Code Playgroud)
它将作为一个真实的表达来评估.
但如果我这样做:
DECLARE @val CHAR(4)
If @val = NULL
Run Code Online (Sandbox Code Playgroud)
它会评估为假.
原因是我正在检查NULL作为@val的值.由于我没有设置@val的值,因此没有分配内存地址,因此@val没有值.
注意:请参阅有关SET ANSI_NULLS(ON | OFF)的部分,因为SQL 7和2000默认值的差异会导致示例无效.这基于SQL 7.
"一片空白"
现在"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’
Run Code Online (Sandbox Code Playgroud)
两个输出都为TRUE.原因是在第一个@val IS NULL我只声明了变量并且没有设置数据的地址空间,其中"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’
Run Code Online (Sandbox Code Playgroud)
您将注意到在执行SET ANSI_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语句返回零行,即使column_name中存在非空值也是如此.
当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并且发现= NULL只有当你在推出默认的2000服务器时显式设置时你的代码现在中断并且可能导致数据问题.
使用IS NULL的另一个原因是,根据SQL 92指南,它仍将评估为TRUE,因此您的代码更安全地升级服务器.
摘要
如果除非您需要检查变量的值是否设置为NULL并且您已将ANSI_NULLS设置为ON,那么总是使用"IS NULL"子句来验证变量是否为NULL.通过使用= NULL代替,您可能会在尝试解决可能由此产生的问题(现在或将来意外)时遇到很多麻烦.
基础
提供的一些信息来自C++的工作原理以及SQL在每种情况下的行为方式.不幸的是,据我所知,SQL没有一个函数地址,允许我输出实际的内存地址来显示引擎盖下发生的事情.在C++中,当创建变量时,变量的地址为0xddddddd(在调试中,但它也可以是不同的非实地址).设置变量时,第一次检查地址将为您提供存储数据的有效内存地址.此外,可以从SQL Books Online的IS NULL和SET ANSI_NULLS ...部分获取更多信息.
= NULL用于赋值给NULL值,而IS NULL用于确定变量是否为NULL值.
sssignment为NULL的示例:
Update TableName Set ColumnName = NULL
Run Code Online (Sandbox Code Playgroud)
与条件子句(链接)中的NULL值进行比较的示例:
Select * From TableName Where ColumnName is NULL
Run Code Online (Sandbox Code Playgroud)
ColumnName IS NOT Null 也可用于确保值为非NULL.