如何筛选按ID分组后其余所有列值全为NULL的分组行
问题原因分析
你编写的SQL存在逻辑错误:GROUP BY子句中额外加入了data1、data2、data3字段,会将同一个ID下字段值组合不同的行拆分为多个独立分组,最终只要某ID下存在任意一行三个数据列全为NULL就会被返回,无法满足「该ID下所有行的所有数据列全部为NULL」的筛选要求。
可行实现方案
方案1:使用MAX()函数判断
SELECT id FROM `example-table` GROUP BY id HAVING MAX(data1) IS NULL AND MAX(data2) IS NULL AND MAX(data3) IS NULL;
逻辑说明:MAX()函数计算时会自动忽略NULL值,如果分组内某列存在任意非NULL的有效值,MAX()就会返回该非NULL值;只有分组内该列所有行都为NULL时,MAX()的返回值才是NULL,刚好匹配你的筛选规则。
方案2:使用COUNT()函数判断
SELECT id FROM `example-table` GROUP BY id HAVING COUNT(data1) = 0 AND COUNT(data2) = 0 AND COUNT(data3) = 0;
逻辑说明:COUNT(指定列)仅统计该列非NULL值的行数,统计结果为0就代表该列在当前ID分组下所有行都是NULL。
内容的提问来源于stack exchange,提问作者lelunaa
相关产品推荐
相关产品推荐

