合并SQL表行,用已有值填充NULL值的通用方法
问题描述
现有如下结构的SQL表:
| Id | A | B |
|---|---|---|
| 1 | value1 | null |
| 1 | null | value2 |
需要编写SELECT查询语句,返回如下结果:
| Id | A | B |
|---|---|---|
| 1 | value1 | value2 |
实际业务表包含更多行和列,需要通用解决方案。
通用解决方案
可以通过分组聚合实现,核心逻辑是按Id分组,用聚合函数提取各列的非null值。
基础实现SQL
SELECT Id, MAX(A) AS A, MAX(B) AS B -- 其他列直接追加:MAX(列名) AS 列名 FROM your_table_name GROUP BY Id;
关键说明
MAX()(或MIN())会自动忽略null值,只要同一Id分组内某列只有一个非null值,就能准确提取目标值,适配字符串、数值等多数数据类型- 针对更多列,只需在SELECT列表中依次添加
MAX(列名) AS 列名,保持GROUP BY Id不变即可
扩展场景:同一列存在多个非null值
如果某列在同一分组内有多个非null值,需要合并结果的话,可使用对应数据库的字符串聚合函数:
- MySQL:
GROUP_CONCAT(DISTINCT A SEPARATOR ',') AS A - PostgreSQL:
STRING_AGG(DISTINCT A, ',') AS A - SQL Server:
STRING_AGG(DISTINCT A, ',') AS A
内容的提问来源于stack exchange,提问作者Cle Ine
相关产品推荐
相关产品推荐

