如何在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
相关产品推荐
相关产品推荐

