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'