猿问

什么是“= null”和“IS NULL”

什么是“= null”和“IS NULL”

“= null”和“IS NULL”有什么区别?他们如何使用不同的方式?



月关宝盒
浏览 1113回答 3
3回答

慕勒3428872

在一个WHERE子句中,column=null永远不会是真的,这种方式使用null是无效的,你需要说column IS NULL或者column IS NOT NULL。这说明了它的特殊性NULL,它不是检查相等性的值,它是一个未知值,所以你需要使用IS或IS NOT语法。您可以NULL使用=相等的值分配值。例如:UPDATE TableX SET Column=NULL...

缥缈止盈

“= NULL”是值的表达式现在,“IS NULL”&nbsp;是用于评估变量条件为NULL的首选方法。有关同一问题的更详细讨论可在以下链接中找到http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/不确定是否可以在不登录网站的情况下阅读文章,因此在此处发布相同的复制内容理解“IS NULL”和“= NULL”之间的区别当使用declare语句在SQL中创建变量时,它将在没有数据的情况下创建,并存储在SQLs内存空间内的变量表(vtable)中。vtable包含变量的名称和内存地址。但是,当创建变量时,没有为变量分配内存地址,因此变量不是根据内存定义的。设置变量时,会分配一个存储器地址,初始数据存储在该地址中。再次设置该值时,变量指向的内存地址中的数据将更改为新值。现在为了区别,为什么每个人的行为方式都如此。“= NULL”“= NULL”是值的表达式。意思是,如果已设置变量并为存储数据创建了内存,则它具有值。事实上,变量可以设置为NULL,这意味着对象的数据值是未知的。如果值设置如下:DECLARE&nbsp;@val&nbsp;CHAR(4)SET&nbsp;@val&nbsp;=&nbsp;NULL您已明确将数据值设置为unknown,因此当您执行以下操作时:If&nbsp;@val&nbsp;=&nbsp;NULL它将作为一个真实的表达来评估。但如果我这样做:DECLARE&nbsp;@val&nbsp;CHAR(4)If&nbsp;@val&nbsp;=&nbsp;&nbsp;NULL它会评估为假。原因是我正在检查NULL作为@val的值。由于我没有设置@val的值,因此没有分配内存地址,因此@val没有值。注意:请参阅有关SET ANSI_NULLS(ON | OFF)的部分,因为SQL 7和2000默认值的差异会导致示例无效。这基于SQL 7。“一片空白”现在“IS NULL”有点棘手,是评估变量条件为NULL的首选方法。当您使用“IS NULL”子句时,它会检查变量的地址和变量中的数据是否为未知。所以如果我做的话:DECLARE&nbsp;@val&nbsp;CHAR(4)If&nbsp;@val&nbsp;IS&nbsp;NULL &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘TRUE’ELSE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘FALSE’SET&nbsp;@val&nbsp;=&nbsp;NULLIf&nbsp;@val&nbsp;IS&nbsp;NULL &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘TRUE’ELSE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘FALSE’两个输出都为TRUE。原因是在第一个@val IS NULL我只声明了变量并且没有设置数据的地址空间,其中“IS NULL”检查。在第二个中,值已显式设置为NULL,“IS NULL”也检查。SET ANSI_NULLS(ON | OFF)现在让我在工作中抛出一个扭结。在前面的示例中,您会看到= NULL只要显式设置值就可以工作。但是,当您设置ANSI_NULLS ON时,事情会有所不同。防爆。DECLARE&nbsp;@val&nbsp;CHAR(4)SET&nbsp;@val&nbsp;=&nbsp;NULLSET&nbsp;ANSI_NULLS&nbsp;ONIf&nbsp;@val&nbsp;=NULL &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘TRUE’ELSE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘FALSE’SET&nbsp;ANSI_NULLS&nbsp;OFFIf&nbsp;@val&nbsp;=NULL &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘TRUE’ELSE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;‘FALSE’您将注意到在执行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 ...部分获取更多信息。

ABOUTYOU

= NULL用于赋值给NULL值,而IS NULL用于确定变量是否为NULL值。sssignment为NULL的示例:Update&nbsp;TableName&nbsp;Set&nbsp;ColumnName&nbsp;=&nbsp;NULL与条件子句(链接)中的NULL值进行比较的示例:Select&nbsp;*&nbsp;From&nbsp;TableName&nbsp;Where&nbsp;ColumnName&nbsp;is&nbsp;NULLColumnName IS NOT Null&nbsp;也可用于确保值为非NULL。
随时随地看视频慕课网APP

相关分类

MySQL
我要回答