如何将多行数据合并为一行?优先取覆盖值,空值用默认值
合并默认与覆盖数据为单行
如何将多行数据合并为一行?其中一行包含商品的默认信息,另一行包含商品的覆盖信息。需要保留所有非空的覆盖信息,若覆盖信息为NULL则使用默认信息。
原始数据表(Table1)
| itemxa_intid | item_intdid | prepTech_intid | buyer_intid | srv_Name | prd_Name | default_itemxa_intid |
|---|---|---|---|---|---|---|
| 724156 | 15799 | 32 | NULL | Default Name 1 | Default Name 2 | 724156 |
| 724157 | 15799 | NULL | 12 | NULL | Overridden Name | 724156 |
| 724158 | 15799 | 16 | NULL | Overridden Name | NULL | 724156 |
当前查询逻辑
首先通过以下查询获取目标覆盖数据:
SELECT * FROM Table1 WHERE itemxa_intid = 724158 -- 该信息来自另一独立查询
查询结果:
| itemxa_intid | item_intdid | prepTech_intid | buyer_intid | srv_Name | prd_Name | default_itemxa_intid |
|---|---|---|---|---|---|---|
| 724158 | 15799 | 16 | NULL | Overridden Name | NULL | 724156 |
再通过默认ID关联查询默认数据:
SELECT * FROM Table1 WHERE itemxa_intid = PreviousQuery.default_itemxa_intid
查询结果:
| itemxa_intid | item_intdid | prepTech_intid | buyer_intid | srv_Name | prd_Name | default_itemxa_intid |
|---|---|---|---|---|---|---|
| 724156 | 15799 | 32 | NULL | Default Name 1 | Default Name 2 | 724156 |
需要将这两行合并为一行,保留覆盖数据的非空值,用默认数据填充NULL,最终结果如下:
| itemxa_intid | item_intdid | prepTech_intid | buyer_intid | srv_Name | prd_Name | default_itemxa_intid |
|---|---|---|---|---|---|---|
| 724158 | 15799 | 16 | NULL | Overridden Name | Default Name 2 | 724156 |
解决方案
可以通过自连接结合COALESCE()函数实现需求,COALESCE()会返回第一个非NULL的参数值,正好满足用覆盖值优先、默认值补位的逻辑:
SELECT t1.itemxa_intid, t1.item_intdid, COALESCE(t1.prepTech_intid, t2.prepTech_intid) AS prepTech_intid, COALESCE(t1.buyer_intid, t2.buyer_intid) AS buyer_intid, COALESCE(t1.srv_Name, t2.srv_Name) AS srv_Name, COALESCE(t1.prd_Name, t2.prd_Name) AS prd_Name, t1.default_itemxa_intid FROM Table1 t1 JOIN Table1 t2 ON t1.default_itemxa_intid = t2.itemxa_intid WHERE t1.itemxa_intid = 724158;
逻辑说明
- 自连接:将目标覆盖数据行(t1)和对应的默认数据行(t2)通过
default_itemxa_intid关联 COALESCE(col1, col2):对每个字段,优先取覆盖行的非空值,若覆盖行为NULL则取默认行的值- 最终返回合并后的单行数据,完全符合需求
内容的提问来源于stack exchange,提问作者Zack Cross
相关产品推荐
相关产品推荐

