如何筛选指定列所有值均为Null的非主键ID?
数据表
| Number | Name |
|---|---|
| 1 | John |
| 1 | Null |
| 2 | Null |
我希望仅返回值为“2”的Number,也就是筛选出Name列所有对应行均为Null的Number。
我尝试了以下查询,但未能得到符合要求的结果:
select top 1000 Number, Name, case when count(name) over (partition by number) = 0 then 'y' end as valid from Numbers n group by Number, Name order by case when count(name) over (partition by Number) = 0 then 'y' end desc, Number desc
我还尝试了Stack Overflow上的相关解决方案,但均未成功:
- 如何在SQL中选择所有列都不为Null的行?
- 查询按ID检查某列的所有单元格是否均为Null
- MySQL:从表中选择列为Null的记录
正确的查询方案
要筛选出所有对应Name行都是Null的Number,核心是判断每个Number分组下不存在非Null的Name值,以下两种方法都能实现:
方法一:用NOT EXISTS精准排查
SELECT DISTINCT Number FROM Numbers n1 WHERE NOT EXISTS ( SELECT 1 FROM Numbers n2 WHERE n2.Number = n1.Number AND n2.Name IS NOT NULL )
逻辑很直接:找那些没有同Number且Name不为Null记录的Number,完全匹配需求。
方法二:分组聚合判断
SELECT Number FROM Numbers GROUP BY Number HAVING COUNT(Name) = 0
COUNT(Name)只会统计非Null的Name数量,等于0就说明该分组下所有Name都是Null,直接筛选即可。
原查询失效的原因
你原查询用了GROUP BY Number, Name,会把同一Number下不同Name拆成独立分组,再和窗口函数混用导致统计逻辑混乱,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者meetra
相关产品推荐
相关产品推荐

