T-SQL中对可为空列执行不等值查询的简洁实现方案问询
T-SQL里简洁处理含NULL的不等值查询
T-SQL里的=和<>(或!=)运算符碰到NULL时会直接跳过匹配——毕竟NULL是缺失值,既不能说和别的值相等,也不能说不等。要筛选出两列不匹配的行(包括一方NULL另一方非NULL、双方非NULL但值不一样的情况),不用ISNULL或COALESCE也能写出简洁的WHERE条件,下面两种方法都可以:
方法1:用INTERSECT处理NULL相等逻辑
INTERSECT会把两个NULL当成相等,非NULL值只有完全一样才会返回结果。所以用NOT EXISTS判断两列的交集是否为空,就能挑出不匹配的行:
drop table if exists #values create table #values (val1 varchar(10), val2 varchar(10)) insert #values values ('', ''), ('', NULL), (NULL, ''), ('A', ''), ('', 'A'), ('A', NULL), (NULL, 'A'), ('A', 'A') select * from #values where NOT EXISTS (SELECT val1 INTERSECT SELECT val2)
方法2:简化逻辑表达式
原来的复杂条件可以合并成更紧凑的写法:直接判断两列不是“完全相等(含都为NULL)”,或者拆成更直观的逻辑:
select * from #values where val1 <> val2 OR (val1 IS NULL <> val2 IS NULL)
这里val1 IS NULL <> val2 IS NULL的意思是“其中一方是NULL,另一方不是”,再加上非NULL时的值不等判断,刚好覆盖所有需要的场景。
这两种写法都能得到你要的6行结果,而且不用依赖ISNULL或COALESCE,逻辑更清爽。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

