比较列对,尝试查找不匹配的列
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
)
;