令人困惑的空比较与 NOT 相结合



我意识到将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,而不是TRUEFALSENOT UNKNOWN也会导致UNKNOWN,这既不TRUE也不FALSE。不能使用NOTUNKNOWN"翻转"为布尔值。

这种 3 向逻辑需要使用IS NULLIS 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')

相关内容

  • 没有找到相关文章

最新更新