SQL查询用HAVING子句无法过滤value字段NULL值问题咨询
问题原因分析
- 你编写的
HAVING子句仅作用于UNION ALL组合中最后一个单独的SELECT查询,不会作用于UNION ALL拼接后的整个结果集。你当前的写法等价于:
select ID, "a" col, a value from yourtable union all select ID, "b" col, b value from yourtable union all (select ID, "c" col, c value from yourtable having value is not Null);
前两个SELECT返回的value为NULL的记录完全没有被过滤,自然会出现在最终结果里。
2. HAVING本身的设计是搭配GROUP BY聚合操作使用的,你当前没有聚合操作,就算是给单条SELECT做非聚合条件过滤,也应该用WHERE而不是HAVING。部分数据库虽然支持无GROUP BY时用HAVING做过滤,但属于非标准用法,兼容性差且执行效率低。
正确写法参考
如果要过滤UNION ALL之后所有结果里的NULL值,有两种推荐写法:
- 写法1:给每个子查询单独加WHERE过滤(效率更高,提前过滤不需要的记录再拼接)
select ID, "a" col, a value from yourtable where a is not null union all select ID, "b" col, b value from yourtable where b is not null union all select ID, "c" col, c value from yourtable where c is not null;
- 写法2:把整个UNION ALL的结果作为子查询,外层统一过滤
select * from ( select ID, "a" col, a value from yourtable union all select ID, "b" col, b value from yourtable union all select ID, "c" col, c value from yourtable ) t where value is not null;
内容的提问来源于stack exchange,提问作者Labixiaoxin
相关产品推荐
相关产品推荐

