查找两个值不相等且为空的行

时间:2018-07-16 22:58:29

标签: sql sql-server tsql

我想知道这种情况下的常用做法。

您需要找到两列不匹配的所有行,这两列都是可为空的(排除两列均为NULL的情况除外)。这些方法都不起作用:

WHERE A <> B --does not include any NULLs

WHERE NOT (A = B) --does not include any NULLs

WHERE (A <> B OR A IS NULL OR B IS NULL) --includes NULL, NULL

除此以外...确实可以,但是我不知道性能是否受到影响...

WHERE COALESCE(A, '') <> COALESCE(B, '')

最近我已经开始使用此逻辑...它干净,简单且有效...会被认为是处理它的常用方法吗?:

WHERE IIF(A = B, 1, 0) = 0
--OR
WHERE CASE WHEN A = B THEN 1 ELSE 0 END = 0

2 个答案:

答案 0 :(得分:4)

这有点痛苦,但是我建议直接使用布尔逻辑:

where (A <> B) or (A is null and B is not null) or (A is not null and B is null)

或:

where not (A = B or A is null and B is null)

如果SQL Server实现ANSI标准is distinct from-安全的运算符NULL,则要简单得多。

如果您使用coalesce(),则典型的方法是:

where coalesce(A, '') <> coalesce(B, '')

之所以使用它,是因为''将转换为大多数类型。

答案 1 :(得分:0)

如何使用except

例如,如果我想获得不是a = b的所有a和b并排除a和b的所有空值

select a, b from tableX where a is not null and b is not null
except
select a,b from tableX where a=b