Sql 为什么1=NULL和1!=还是一样?
以下Sql 为什么1=NULL和1!=还是一样?,sql,database,null,Sql,Database,Null,以下 IF 1 = NULL BEGIN SELECT 'A' END ELSE BEGIN SELECT 'B' END 按预期返回结果B 这就是事情变得真正有趣的地方 IF 1 != NULL BEGIN SELECT 'A' END ELSE BEGIN SELECT 'B' END 也返回B 为什么会是这种情况?如果语句为真,则两者都不是NU
IF 1 = NULL
BEGIN
SELECT 'A'
END
ELSE
BEGIN
SELECT 'B'
END
按预期返回结果B
这就是事情变得真正有趣的地方
IF 1 != NULL
BEGIN
SELECT 'A'
END
ELSE
BEGIN
SELECT 'B'
END
也返回B
为什么会是这种情况?如果语句为真,则两者都不是
NULL
既不等于某物,也不等于某物。有些东西是空的
或者不是空的
我想空的意思是,在某种程度上,它是不可由,=,!=接线员。这种比较可能返回NULL。然后跳过if(NULL)
处理。您无法比较NULL
=NULL
——它没有值
SELECT 1
WHERE NULL = NULL
不归还任何东西
比较NULL
值时,使用IS
not=
SELECT 1
WHERE NULL IS NULL
1岁
来自MSDN:
要确定表达式是否为NULL,请使用is NULL或NOT NULL
而不是比较运算符(例如=或!=)。比较
如果其中一个或两个参数都为NULL,则运算符返回UNKNOWN
这很简单。在ANSI术语中,任何包含NULL的表达式(逻辑或算术)都有未知结果:
(1 = NULL) IS UNKNOWN
(1 <> NULL) IS UNKNOWN
(1 + NULL) IS UNKNOWN
(1 * NULL) IS UNKNOWN
(1=NULL)未知
(1 NULL)是未知的
(1+NULL)未知
(1*NULL)未知
因此,在这两种情况下,您都会进入ELSE分支
请尝试链接以获得更多解释。它既不等于也不等于NULL
,因为NULL
不是事物,而是事实上没有事物
ANSI SQL 1999(虽然还不是MSSQL)包含一个名为的方法,它[没有]与不同,可以在NULL
上使用该方法,得到您可能期望的结果
这里有一篇关于<代码>的优秀文章,它与伊兹克·本·甘的<代码>行为和<代码>空的混乱本质不同
谓词可以计算为TRUE、FALSE或UNKNOWN。每当涉及null时,谓词的计算结果都是未知的
这是厄兰·索马斯科格的心愿:
SQL:1999定义的运算符与分别与和=相同的运算符不同,但它们也适用于空值
(来自Erland)以下是MVP Steve Kass连接上的链接,请求该功能:
这是一个常见的要求,但为许多列编写此代码既繁琐又容易出错(特别是由于和/或优先级问题)。更改ANSI_NULLS的设置不是一个解决方案,因为它不影响列到列的比较,只影响列到变量的比较。将ANSI_NULLS设置为off也是非标准的,并且不够精细,无法应用于单个查询中的特定比较
同意其他人已经说过的话。简单地从另一个角度进行评论,如果您尝试将ansi_nulls
设置为off,您可能会得到您期望的结果:
set ansi_nulls off
if 1 = null
select 'a'
else
select 'b' -- Returned
if 1 != null
select 'a' -- Returned
else
select 'b'
更多在线图书信息:
当“设置ANSI_NULLS”处于禁用状态时,等于(=)和不等于()
比较运算符不遵循ISO标准。精选
使用WHERE column_name=NULL的语句返回
列名称中有空值。使用WHERE的SELECT语句
column_name NULL返回在
专栏。另外,一个SELECT语句使用WHERE列的名称
XYZ_值返回所有非XYZ_值的行和非XYZ_值的行
空
这是ansi_nulls off
解释的。但是,不要简单地关闭它,因为:
在SQL Server的未来版本中,ANSI_NULLS将始终处于打开和关闭状态
任何显式将选项设置为OFF的应用程序都将生成
一个错误。避免在新的开发工作中使用此功能,并计划
修改当前使用此功能的应用程序
请遵循以下建议:
使脚本按预期工作,而不考虑ANSI_空值
数据库选项或设置ANSI_NULL,use为NULL且为
在可能包含空值的比较中不为空
不能等于“nothing”。NULL
永远不等于、不等于、大于或小于任何值。真的吗?不可能不平等?你不可能不平等。你也不能一无所获。就像你不能加零、减零或乘零一样。从你的链接中…所有与空值比较的结果都将被计算为未知值,这将编辑你的回答为正确。@ShannonSeverance听起来更好。无法查询SELECT 1=NULL-解析失败。我会记住你的评论。词汇混乱。PL/SQL具有布尔数据类型。布尔值可以取三个值:true
、false
和null
。
if 1 is null
select 'a'
else
select 'b' -- Returned
if 1 is not null
select 'a' -- Returned
else
select 'b'