【问题标题】:NULL comparison, take 2NULL比较,取2
【发布时间】:2010-09-24 06:42:24
【问题描述】:

我有一个子查询,用在 WHERE 部分:

A.column <> B.column

不幸的是,如果 A.column 或 B.column 为 NULL,则它不起作用。所以,我将其转换为:

((A.column <> B.column) OR ((A.column IS NULL) <> (B.column IS NULL)))

,假设“Table.column IS NULL”是布尔值,我可以比较 2 个布尔值。但是……

我不喜欢

((A.column <> B.column) OR ((A.column IS NULL) AND (B.column IS NOT NULL)) OR
((A.column IS NOT NULL) AND (B.column IS NULL)))

我该如何解决这个问题?

问候,

【问题讨论】:

    标签: sql sql-server comparison null


    【解决方案1】:

    当两个值相等时,NULLIF 产生 null =)

    WHERE NULLIF(A.column, B.column) IS NOT NULL
    

    【讨论】:

    • 不起作用。如果 A.column 为空,即使 B.column 不为空,结果也将始终为空。
    【解决方案2】:

    使用ISNULL 函数。

    【讨论】:

      【解决方案3】:
      (ISNULL(A.column,0)) <> (ISNULL(B.column,0))
      

      【讨论】:

      • 这不是将 0 和 NULL 同等对待吗?不会选择包含A=0B=NULL 的行。
      • 正如 paxdiablo 所写,我必须有一个从未使用过的值。不幸的是,我没有这样的价值观。更糟糕的是,要使用 ISNULL,我必须知道列类型。我最好使用 ((NULL AND NOT NULL) OR (NOT NULL AND NULL)) 代替。
      【解决方案4】:

      在 MySQL 中你可以使用

      WHERE NOT(A <=> B) 
      

      做一个WHERE A &lt;&gt; B 也适用于null。

      见:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-26
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 2021-09-01
        相关资源
        最近更新 更多