查询含空值的表:按Col1分组判断Col2全填充生成Col3的简便方法
无需额外嵌套表的简便实现方案
当然有啦!完全不用搞嵌套子查询或者创建额外表,用基础的聚合函数就能轻松实现需求,而且执行效率还很高,几乎所有主流SQL数据库(比如MySQL、PostgreSQL、SQL Server、Oracle)都支持。
给你两种常用的写法:
写法一:利用COUNT函数的特性
SELECT Col1, CASE WHEN COUNT(Col2) = COUNT(*) THEN 1 ELSE 0 END AS Col3 FROM tbl GROUP BY Col1;
原理很简单:COUNT(Col2)只会统计Col2字段非空的记录数,而COUNT(*)会统计分组内的所有记录数。如果两者相等,说明这个分组里的Col2没有空值,返回1;反之只要有一个空值,两者就不相等,返回0。
写法二:结合CASE和MAX函数
SELECT Col1, 1 - MAX(CASE WHEN Col2 IS NULL THEN 1 ELSE 0 END) AS Col3 FROM tbl GROUP BY Col1;
这个思路是:先通过CASE语句把空值标记为1,非空标记为0,然后用MAX取分组里的最大值——如果分组里有任何一个空值,MAX就会返回1,1减1得到0;如果全都是非空值,MAX返回0,1减0得到1,正好符合你的需求。
这两种写法都是单表扫描一次就完成计算,没有额外的嵌套或者临时表,非常简洁高效。
内容的提问来源于stack exchange,提问作者rakamakafo
相关产品推荐
相关产品推荐

