代码之家  ›  专栏  ›  技术社区  ›  Vaccano

混淆空比较

  •  -1
  • Vaccano  · 技术社区  · 7 年前

    我意识到比较 NULL 任何其他价值(包括 无效的 )总是会导致错误。

    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')
    

    这也输出:

    假
    假
    

    我希望 NOT 会将值翻转为true。(如果 @IsSet 第一个表达式设置为0)

    似乎与空值的比较对括号外的布尔逻辑具有某种能力。

    但是空比较在布尔逻辑上并不是万能的:

    SELECT IIF((@IsSet = 1) OR (1=1), 'true', 'false')
    SELECT IIF((@IsSet != 1) OR (1=1), 'true', 'false')
    

    这将返回:

    true
    true
    

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

    有人能解释一下为什么 NOT(NULL!=1) 不等于真。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Dan Guzman    7 年前

    NULL 结果 UNKNOWN 而不是 TRUE FALSE . NOT UNKNOWN 也会导致 未知 ,两者都不是 真的 也不 错误的 . 不能“翻身” 未知 使用 NOT .

    这个三向逻辑需要一个 IS NULL or IS NOT NULL 测试空值而不是传统的布尔逻辑。

        2
  •  1
  •   Osama Saleem    7 年前

    你的使用方式不对。如果只按以下方式执行not条件,则会出现错误:

    SELECT NOT(@IsSet = 1)
    

    如果在IIF条件中包含不正确的NOT条件用法,SQL Server将不会显示错误,但是语句将被计算为假输出。

    如果要显式检查空值,则可以采用以下做法。

    SELECT IIF(@IsSet IS NULL, 'true', 'false')
    

    最后,以下条件在输出中返回“true”,因为其中一个或条件(1==1)始终求值为“true”,因此IIF语句的总体输出为true。

    SELECT IIF((@IsSet = 1) OR (1=1), 'true', 'false')
    SELECT IIF((@IsSet != 1) OR (1=1), 'true', 'false')