operator NOT不会反转NULL比较的结果

时间:2016-04-04 12:35:13

标签: 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)会反转表达式的结果吗?

根据Microsoft的说法:“将NULL与非NULL值进行比较总是导致FALSE。”

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

https://msdn.microsoft.com/en-us/library/ms188074.aspx

编辑:我发错了文章。 我在上面的引用来自这篇文章:https://msdn.microsoft.com/en-us/library/ms175118.aspx

本文似乎有错误,如下面的答案和评论中所述。

4 个答案:

答案 0 :(得分:3)

因此,T-SQL实现了所谓的Three-Valued Logic。这意味着T-SQL代码中的每个逻辑表达式都可以评估为TRUEFALSENULL。现在,SQL Server为您提供了2个选项,可以使用SET ANSI_NULL命令处理NULLs的逻辑表达式。 SQL Server的默认行为(SET ANSI_NULL ON)是与NULL的每个逻辑比较都将返回NULL。所以下面的表达式

NULL = NULL;
1 = NULL;
1 <> NULL;

将全部评估为NULL。如果出于某种原因,您希望逻辑表达式返回true或false,即使它们中包含NULL值,您也必须关闭ANSI_NULL,但这是不可取的。

小编辑:包含NULL的逻辑表达式将评估为NULL以外的其他内容的唯一情况如下:

(NULL) OR (TRUE) = TRUE

以下是T-SQL代码

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

实际上会打印True

答案 1 :(得分:2)

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

问题中的链接指出:

  

SET ANSI_NULLSON时,一个或两个 NULL表达式的运算符将返回UNKNOWN。当SET ANSI_NULLSOFF时,相同的规则适用,除非等于(=)运算符返回TRUE,如果两个表达式为{{1} }。例如,当NULLNULL = NULL时,TRUE会返回SET ANSI_NULLS

因此,无论您在OFF中使用的值是什么,语句SET ANSI_NULLS都会产生1 = null值。

然而,在= (Equals) (Transact-SQL) page中, 备注部分说明:

  

UNKNOWN与非NULL值进行比较始终会产生NULL

显然情况并非如此,因为FALSE未返回1 = null,它会返回FALSE

因此,我的结论是UNKNOWN运算符文档的文档中存在错误。

答案 2 :(得分:2)

请参阅: SET ANSI_NULLS (Transact-SQL)

  

在SQL Server 2016中使用空值时,指定Equals(=)和Not Equal To(&lt;&gt;)比较运算符的ISO兼容行为。

     

在SQL Server的未来版本中,ANSI_NULLS将始终为ON,并且将选项明确设置为OFF的任何应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

因此,如果你使用它并将其设置为OFF,那么你的代码将按照需要运行:

SET ANSI_NULLS OFF

select 'true'  where (1 = NULL) ; 

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

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

答案 3 :(得分:1)

使用NULL

检查或比较值的更好方法
select 'true'  where 1 IS NULL ; 

select 'true' where 1 IS NOT NULL ;