Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 运算符NOT不会反转空比较的结果_Sql Server_Sql Server 2008 R2_Boolean Logic_Boolean Operations - Fatal编程技术网

Sql server 运算符NOT不会反转空比较的结果

Sql server 运算符NOT不会反转空比较的结果,sql-server,sql-server-2008-r2,boolean-logic,boolean-operations,Sql Server,Sql Server 2008 R2,Boolean Logic,Boolean Operations,请参阅以下两项声明: select 'true' where (1 = NULL) ; select 'true' where not (1 = NULL) ; 它们都返回空 这意味着表达式(1=NULL)和not(1=NULL)都返回false!但这怎么可能呢?我认为操作符NOT(expression)将反转表达式的结果 根据微软的说法:“将空值与非空值进行比较总是导致错误。” 好的,但这意味着操作符NOT必须反转结果。但为什么不这样做呢 编辑:我发错了文章。 我上面的引述来自这篇文

请参阅以下两项声明:

select 'true'  where (1 = NULL) ; 

select 'true' where not (1 = NULL) ;
它们都返回空

这意味着表达式
(1=NULL)
not(1=NULL)
都返回false!但这怎么可能呢?我认为操作符
NOT(expression)
将反转表达式的结果

根据微软的说法:“将空值与非空值进行比较总是导致错误。”

好的,但这意味着操作符
NOT
必须反转结果。但为什么不这样做呢

编辑:我发错了文章。 我上面的引述来自这篇文章:


这篇文章似乎有一个错误,如下面的答案和评论所述。

我认为您在文档中发现了一个错误,但它不是在您链接的页面上,而是在另一个页面上

问题中的链接说明:

SET ANSI_NULLS
ON
时,具有一个或两个
NULL
表达式的运算符返回
UNKNOWN
。当
SET ANSI_NULLS
OFF
时,除了equals(
=
)运算符返回
TRUE
如果两个表达式均为
NULL
,则应用相同的规则。例如,
SET ANSI_NULLS
OFF
时,
NULL=NULL
返回
TRUE

因此,无论您在
SET ANSI_NULLS
中使用的值是什么,语句
1=null
将产生一个
未知的值

但是,, 备注部分指出:

NULL
与非NULL值进行比较总是导致
FALSE

显然情况并非如此,因为
1=null
不会返回
FALSE
,而是返回
UNKNOWN

因此,我的结论是
=
操作员文档中存在错误。

请参阅:

指定在SQL Server 2016中将等于(=)和不等于()比较运算符与空值一起使用时,它们的ISO兼容行为

在SQL Server的未来版本中,ANSI_NULLS将始终处于打开状态,任何显式将该选项设置为关闭的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序

因此,如果您使用此选项并将其设置为“关闭”
,您的代码将按需要工作:

SET ANSI_NULLS OFF

select 'true'  where (1 = NULL) ; 

select 'true' where not (1 = NULL) ;

但正如文档中所述,它将在将来导致错误。

因此,T-SQL实现了所谓的。这意味着T-SQL代码中的每个逻辑表达式都可以计算为
TRUE
FALSE
NULL
。现在,SQL Server为您提供了两个选项,可以使用命令
NULLs
处理逻辑表达式。SQL Server的默认行为(将ANSI_NULL设置为ON)是,与
NULL
进行的每个逻辑比较都将返回
NULL
。那么下面的表达式

NULL = NULL;
1 = NULL;
1 <> NULL;
下面的T-SQL代码

SET ANSI_NULLS ON;
GO
IF ((NULL=NULL) OR (1=1))
   PRINT 'True';
GO

将实际打印
True

检查或比较值与
NULL

select 'true'  where 1 IS NULL ; 

select 'true' where 1 IS NOT NULL ;

您不能使用
=
来比较空值。您需要使用
为NULL
。将
=
与NULL进行任何比较都会产生
NULL
,而
NULL
的对立面也是
NULL
。这与问“你的宇宙飞船的颜色是白色的”或“你的宇宙飞船的颜色不是白色的”是一样的。你不能回答这两个问题,因为你没有答案spaceship@a_horse_with_no_name但是,微软的文档是错误的,你链接到的那篇文章说“一个有一个或两个空表达式的操作符返回未知”。因此,您的
1=NULL
比较将始终返回UNKNOWN,而不是TRUE或FALSE。未知转化为未知。因此,在这两种情况下,您都得不到任何回报。您提供的链接不包含您的问题的引用。为了澄清-在OP提供的链接中,声明事实上是正确的-使用
=
运算符,并在任一侧使用
null
值将返回
UNKNOWN
。但实际上有这样一种说法:将NULL值与非NULL值进行比较总是导致FALSE。显然这是一个错误。是的,正如我在上面写的,我发布了错误的链接。正如你所说,我引用了另一页的话。我已经给微软写了一封反馈信,希望他们能纠正。谢谢你的来信,我会尽快投票给你,只要我有权这么做(需要15分),我认为正确引用的文档在这里也是错误的。尝试语句“SELECT'it works!',其中1!=NULL”,同时打开和关闭SET ANSI_NULLS,并验证在关闭ANSI_NULLS的情况下,WHERE子句的计算结果是否为true(我自己在版本12 SP3上进行了测试)。如果在任何WHERE/AND子句上使用ANSIU NULLS,则带有NULL比较的结果为UNKNOWN,然后将其解释为false。“不未知”仍然是未知的,因此仍然是错误的。使用ANSI_NULLS ON和“IS(NOT)NULL”作为一个_horse_,其名称在他对原始问题的评论中已经指出。事实上,三值逻辑解释了这一切。谢谢你的来信,我会尽快投票给你,只要我有权这么做(需要15分)没问题!一般来说,
NULL
的存在和使用在关系数据库中是一个非常有争议和有趣的话题。如果你真的对数据库理论和/或数据库感兴趣,有一些关于这个主题的非常酷的文章。这是一篇很棒的文章,你可以开始阅读:是的,谢谢。我有一个类似于
的表达式,WHERE NOT(x.a=y.b)
。当
y.b
为NULL而不是具有“常规”值时,这不正确。我建议您应该这样检查
,其中x.a=y.b和y.b不是NULL
,但这不一样;)
select 'true'  where 1 IS NULL ; 

select 'true' where 1 IS NOT NULL ;