代码之家  ›  专栏  ›  技术社区  ›  Jim B

SQL Server 2005-比较时使用空值

  •  4
  • Jim B  · 技术社区  · 14 年前

    这个问题更像是为了满足我自己的好奇心。给出以下声明:

    DECLARE @result BIT
    SET @result = CASE WHEN NULL <> 4 THEN 0
                       ELSE 1
                  END
    PRINT @result
    

    为什么我要回到“1”而不是“0”

    将其改为:

    DECLARE @result BIT
    SET @result = CASE WHEN NULL IS NULL
                            OR NULL <> 4 THEN 0
                       ELSE 1
                  END
    PRINT @result
    

    正确地返回“0”

    我知道空比较可能很棘手,但这个特殊的例子在我们的代码审查过程中溜走了。

    如有任何澄清,将不胜感激。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Martin Smith    14 年前

    这是因为 3 valued logic . 在第一种情况下,“未知”不会计算为“真”,因此最终会出现在“其他”中。

    DECLARE @result BIT
    SET @result = CASE WHEN Unknown THEN 0
                       ELSE 1
                  END
    PRINT @result
    

    在第二种情况下,您正在执行“真”或“未知”,计算结果为“真”。

    DECLARE @result BIT
    SET @result = CASE WHEN True
                            OR Unknown THEN 0
                       ELSE 1
                  END
    PRINT @result
    
        2
  •  1
  •   luksan    14 年前

    这是由于ansi-sql标准和带有空值的比较运算符的行为造成的。每当要将值与可能为空的值进行比较时,需要使用is运算符显式检查值可能为空的情况。也可以在SQL Server中禁用ansi_nulls选项。

    以下示例可以满足您的需要:

    DECLARE @result BIT  
    DECLARE @input INT
    
    SET @input = NULL
    SET @result = CASE WHEN (@input IS NULL OR @input <> 4) THEN 0  
                       ELSE 1  
                  END  
    PRINT @result  
    

    或者:

    SET ANSI_NULLS OFF
    
    DECLARE @result BIT 
    SET @result = CASE WHEN NULL <> 4 THEN 0 
                       ELSE 1 
                  END 
    PRINT @result 
    

    参考文献:

    http://msdn.microsoft.com/en-us/library/ms188048.aspx

        3
  •  1
  •   Mark Bowytz Hydrino    14 年前

    从纯技术角度来看,第一条语句返回1的原因是因为ansi_nulls被设置为“on”,它将空值视为“unknown”,并遵循ISO标准。

    若要按预期对值进行计算,请使用 SET ANSI_NULLS OFF 在前面。

    当然,在现实生活中, ISNULL() 是最棒/最安全的方法。