什么是"= null"和"IS NULL"

use*_*820 31 mysql database

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

ano*_*ser 38

在一个WHERE子句中,column=null永远不会是真的,这种方式使用null是无效的,你需要说column IS NULL或者column IS NOT NULL.这说明了它的特殊性NULL,它不是检查相等性的值,它是一个未知值,所以你需要使用ISIS 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 ...部分获取更多信息.


Tre*_*ner 7

= 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.