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

如何在SQL中分组记录并合并展示各列的非空值?

如何用SQL合并同组记录并保留各列非空值

你需要的是把同一分组(这里按name分组)的多条零散记录合并,让每个字段展示该分组下的非空值。这个需求用聚合函数配合分组就能轻松实现——多数聚合函数会自动忽略NULL值,刚好匹配我们的场景。

具体SQL实现

假设你的表名为user_info,可以用以下查询语句:

SELECT 
    MIN(id) AS id,  -- 这里选分组里最小的id,你也可以根据业务需求换成MAX(id)
    name,
    MAX(phone) AS phone,
    MAX(address) AS address
FROM user_info
GROUP BY name;

逻辑解释

  • GROUP BY name:把所有name相同的记录归为一组,这是合并的基础
  • MAX(phone)/MAX(address):聚合函数会自动跳过NULL值,直接返回分组内该字段的非空值(如果分组内该字段只有一个非空值,MAX的结果就是它本身)
  • MIN(id):分组后id会有多个取值,这里选最小的作为合并后的id,你可以根据实际需求调整这个逻辑

验证你的示例数据

用你给出的测试数据:

id | name | phone | address
1 | bob | 123457 | NULL
2 | bob | NULL | some address

执行上述SQL后,得到的结果完全符合你的预期:

id | name | phone | address
1 | bob | 123457 | some address

特殊场景处理

如果同一分组内某个字段存在多个非空值(比如同一个name对应两个不同的phone),MAX()会返回最大的那个值,MIN()则返回最小的。如果需要保留所有非空值,可以用拼接类函数:

-- MySQL示例:拼接多个非空phone,用逗号分隔
SELECT 
    MIN(id) AS id,
    name,
    GROUP_CONCAT(DISTINCT phone SEPARATOR ', ') AS phone,
    MAX(address) AS address
FROM user_info
GROUP BY name;

内容的提问来源于stack exchange,提问作者Adam Chubbuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:00