比较列对,尝试查找不匹配的列

SELECT
    RecID,
    Field1,
    Field2
FROM
    TestTable
WHERE
    Field1 != Field2

但是我想在检查中包括空值。两列中的Null均有效,但是一列而不是另一列中的Null无效,因此需要将其包含在输出中
SELECT
    RecID,
    Field1,
    Field2
FROM
    TestTable
WHERE
    (Field1 != Field2)
    OR (Field1 IS NULL AND Field2 IS NOT NULL)
    OR (Field1 IS NOT NULL AND Field2 IS NULL)

这是编写此代码的最佳方法,还是有比较整齐/更好的方式进行Null / Not Null比较?

最佳答案

我认为您可以使用更简洁的方式编写过滤条件:

SELECT
    ID,
    Field1,
    Field2
FROM
    TestTable
WHERE
    NOT((Field1 = Field2) OR (Field1 IS NULL AND Field2 IS NULL))
;

但是,此查询将产生不正确的结果。
您的变体是正确的。

@Heinzi和Connect item提到的有关拟议的IS DISTINCT FROM运算符的this answer链接到Paul White的一个很好的帖子:Undocumented Query Plans: Equality Comparisons

Paul在那篇文章中解释说查询处理器已经具有此运算符,该运算符用于INTERSECT查询。

您的示例可以重写为:
SELECT
    ID,
    Field1,
    Field2
FROM
    TestTable AS T
WHERE
    NOT EXISTS
    (
        SELECT T.Field1

        INTERSECT

        SELECT T.Field2
    )
;
  • 产生正确的结果
  • 它有一个很好的执行计划
  • 通过这种形式,可以轻松添加更多字段进行比较
  • 10-05 20:50
    查看更多