【问题标题】:Comparing a value to a NULL in t-SQL在 t-SQL 中将值与 NULL 进行比较
【发布时间】:2012-07-24 15:32:08
【问题描述】:

我很好奇在 t-SQL 中将 NULL 与值进行比较是否合法?

例如,如果我有:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE ctx.n1 < 130

在这种情况下,WHERE 子句总是被评估为 FALSE。这是我可以依靠的东西吗?

【问题讨论】:

    标签: sql sql-server tsql null


    【解决方案1】:

    T-Sql 中所有 null 值的布尔运算都返回“UNKNOWN”,在子句中被识别为 false。当你想设置一些默认值时,你可以使用 ISNULL 函数。 例如在你的情况下:

    WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
    SELECT n0 FROM ctx
    WHERE isnull(ctx.n1,0) < 130
    

    【讨论】:

      【解决方案2】:

      您不能将 NULL 与任何其他值进行比较,这将导致 'UNKNOWN'

      来自msdn source

      NULL 值表示该值未知。 NULL 值 不同于空值或零值。没有两个空值 平等的。两个空值之间的比较,或者一个 NULL 和任何值之间的比较 其他值,返回未知,因为每个 NULL 的值都是未知的。

      【讨论】:

        【解决方案3】:

        这取决于 ANSI_NULLS 的值。

        http://msdn.microsoft.com/en-us/library/ms191270%28v=sql.90%29.aspx

        当 SET ANSI_NULLS 为 ON 时,一个或多个 表达式为 NULL 不会产生 TRUE 或 FALSE;它产生 未知。

        Transact-SQL 支持允许比较的扩展 运算符在与空值进行比较时返回 TRUE 或 FALSE。 此选项通过设置 ANSI_NULLS OFF 来激活。当 ANSI_NULLS 是 OFF,ColumnA = NULL 等比较在 ColumnA 时返回 TRUE 当 ColumnA 包含某个值时,包含一个空值和 FALSE 除了NULL。

        【讨论】:

          【解决方案4】:

          = 中的 WHERE 子句也是 FALSE。你需要非常小心 NULLs

          WITH ctx AS
          (
          SELECT 123 AS n0, NULL AS n1
          ) 
          SELECT *
          FROM ctx 
          WHERE ctx.n1 = NULL
          

          【讨论】:

            【解决方案5】:

            我一直将 EXISTS 关键字与 EXCEPT 一起使用

            SELECT 1
            WHERE EXISTS ((SELECT 1) EXCEPT (SELECT NULL))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-04-20
              • 1970-01-01
              • 2013-05-04
              • 1970-01-01
              • 1970-01-01
              • 2013-07-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多