Sql server 将null与NOT组合起来比较容易混淆

Sql server 将null与NOT组合起来比较容易混淆,sql-server,tsql,null,Sql Server,Tsql,Null,我意识到将NULL与任何其他值(包括NULL)进行比较总是会导致false DECLARE @IsSet bit = NULL; SELECT IIF(@IsSet = 1, 'true', 'false') SELECT IIF(@IsSet != 1, 'true', 'false') 这将产生: false false 但这是让我困惑的部分: SELECT IIF(NOT(@IsSet = 1), 'true', 'false') SELECT IIF(NOT(@IsSet != 1

我意识到将NULL与任何其他值(包括NULL)进行比较总是会导致false

DECLARE @IsSet bit = NULL;

SELECT IIF(@IsSet = 1, 'true', 'false')
SELECT IIF(@IsSet != 1, 'true', 'false')
这将产生:

false
false
但这是让我困惑的部分:

SELECT IIF(NOT(@IsSet = 1), 'true', 'false')
SELECT IIF(NOT(@IsSet != 1), 'true', 'false')
这还产生:

false
false
我希望NOT会将该值转换为TRUE。如果第一个表达式的@IsSet设置为0,则会执行此操作

与空值的比较似乎对括号外的布尔逻辑有一定的作用

但是空比较并不是布尔逻辑的全部功能:

SELECT IIF((@IsSet = 1) OR (1=1), 'true', 'false')
SELECT IIF((@IsSet != 1) OR (1=1), 'true', 'false')
这将返回:

true
true
我不明白这里发生了什么,但我认为这是故意的。但我不知道为什么


有人能解释为什么不空吗=1不等于true。

您使用not的方式不正确。如果只执行NOT条件,则会出现错误,如下所示:

SELECT NOT(@IsSet = 1)
当您将NOT条件的不正确用法包含在IIF条件中时,SQL server不会向您显示错误,但是该语句将被计算为假输出

如果您想要显式地检查NULL值,那么可以采用以下实践

SELECT IIF(@IsSet IS NULL, 'true', 'false')
最后,以下条件在输出中返回'true',因为OR条件1==1中的一个总是计算为'true',因此IIF语句的总体输出为true

SELECT IIF((@IsSet = 1) OR (1=1), 'true', 'false')
SELECT IIF((@IsSet != 1) OR (1=1), 'true', 'false')
与NULL的比较结果为未知,而不是真或假。不未知也会导致未知,这既不正确也不错误。不能使用NOT将未知值翻转为布尔值


这种三向逻辑需要用来测试空值,而不是传统的布尔逻辑。

与空值进行比较会得到未知结果,而不是真或假。不未知也会导致未知,这既不正确也不错误。不能将未知值转换为布尔值。@DanGuzman-这是有道理的。有了这些额外的信息,我可以在谷歌上搜索它,并找到了这个文档:一些有限的和或操作是允许的,但实际上什么都不是。请考虑把帖子作为一个答案。经验法则:永远,永远,永远不要把任何东西与空。答案永远不会是您所期望的。只需补充一点:在大多数情况下,取决于特定于开发人员的业务规则来决定给定上下文中的NULL是否为真。在给定的情况下,我倾向于使用IIFISNULL@IsSet,0=1,'true','false'。在进行比较之前,这将在NULL的位置设置一个0。