我意识到将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,则会执行此操作(
似乎与 null 值的比较对括号外的布尔逻辑具有一定的功能。
但是零比较在布尔逻辑上并不全是强大的:
SELECT IIF((@IsSet = 1) OR (1=1), 'true', 'false')
SELECT IIF((@IsSet != 1) OR (1=1), 'true', 'false')
这将返回:
true
true
我不明白这里发生了什么,但我认为这是故意的。 但我不知道为什么。
有人可以解释为什么NOT(NULL!=1)
不等于真实。
与NULL
进行比较会导致UNKNOWN
,而不是TRUE
或FALSE
。NOT UNKNOWN
也会导致UNKNOWN
,这既不TRUE
也不FALSE
。不能使用NOT
将UNKNOWN
"翻转"为布尔值。
这种 3 向逻辑需要使用IS NULL
或IS NOT NULL
来测试 NULL 值,而不是传统的布尔逻辑。
您使用 NOT 的方式不正确。如果仅执行 NOT 条件,则会出现错误,如下所示:
SELECT NOT(@IsSet = 1)
当您在 IIF 条件中将不正确的 NOT 条件用法括起来时,SQL 服务器不会向您显示错误,但是该语句将被评估为 false 输出。
如果要显式检查 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')