请参阅以下两个陈述:
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本文似乎有错误,如下面的答案和评论中所述。
答案 0 :(得分:3)
因此,T-SQL实现了所谓的Three-Valued Logic。这意味着T-SQL代码中的每个逻辑表达式都可以评估为TRUE
,FALSE
或NULL
。现在,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_NULLS
为ON
时,一个或两个NULL
表达式的运算符将返回UNKNOWN
。当SET ANSI_NULLS
为OFF
时,相同的规则适用,除非等于(=
)运算符返回TRUE
,如果两个表达式为{{1} }。例如,当NULL
为NULL = 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 ;