【问题标题】:SQL Conditional loses NULL valuesSQL Conditional 丢失 NULL 值
【发布时间】:2014-06-09 22:22:16
【问题描述】:

我使用的是 SQL Server 2005。我有一个变量 @var,它可以取值 0、1 或 NULL。我关心它是否为 1,0 和 NULL 对我来说是相同的。但是当我将它设置为非 1 时,我会丢失 NULL 值:

DECLARE @var INT
SET     @var = NULL

IF @var <> 1
    PRINT 'not 1'
ELSE 
    PRINT 'equals 1'

输出是“等于 1”。得到“非 1”的正确代码是什么?

【问题讨论】:

    标签: sql sql-server null conditional


    【解决方案1】:

    NULL 表示未知,因此 SQL Server 不能 100% 确定它不是 1。另一方面,如果您有“IF @val = 1”,那么它会说它不能确定它为 1 并移至您的 ELSE 语句。

    COALESCE 和 ISNULL 解决方案通过将 NULL 值转换为已知值来为您工作,但重要的是要知道它为什么会这样工作。

    http://technet.microsoft.com/en-us/library/ms191504(v=SQL.105).aspx

    【讨论】:

      【解决方案2】:

      您也可以为此使用coalesce

      if coalesce(@var, 0) <> 1
          PRINT 'not 1'
      ELSE 
          PRINT 'equals 1'
      

      【讨论】:

        【解决方案3】:

        你不能和NULL比较,这是使用指令设置的属性

        SET ANSI-NULLS OFF
        

        更多信息请见here

        当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 () 比较运算符不遵循 ISO 标准。一个选择 使用 WHERE column_name = NULL 的语句返回的行 column_name 中有空值。使用 WHERE 的 SELECT 语句 column_name NULL 返回列中具有非空值的行 柱子。此外,使用 WHERE column_name 的 SELECT 语句 XYZ_value 返回所有不是 XYZ_value 且不是 空。

        但是,此标志已被弃用,您不应真正使用它。

        这里的正确方法是

        IF @var IS NULL OR @var <> 1
            PRINT 'not 1'
        ELSE 
            PRINT 'equals 1'
        

        【讨论】:

          【解决方案4】:
          IF @var = 1
              PRINT 'equals 1'
          ELSE 
              PRINT 'not 1'
          

          IF @var <> 1 or @var is null
              PRINT 'not 1'
          ELSE 
              PRINT 'equals 1'
          

          因为与 null 比较会导致 unknown 不是 true。对null 值使用IS 运算符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-29
            • 1970-01-01
            • 2015-11-10
            • 2016-08-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多