You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选指定列所有值均为Null的非主键ID?

数据表

NumberName
1John
1Null
2Null

我希望仅返回值为“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:22:49