我想知道这种情况下的常用做法。
您需要找到两列不匹配的所有行,这两列都是可为空的(排除两列均为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
答案 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