在数据处理过程中,我们常常要把多个查询结果里的数组结构列拼在一起,但这些列拥有的字段可能不一样。如果直接合并,就会出现字段不匹配或者数据错位的问题。下面通过示例来讲解可行的处理办法。

使用UNION ALL补空字段
最常见的方式是利用UNION ALL,把缺少的字段用NULL或者默认值补齐,让所有结果集拥有相同的列结构。
示例表结构
假设有两个表,表A的数组列包含id和name,表B的数组列包含id、name和age。
-- 表A数据示例 SELECT id, name, NULL AS age FROM table_a UNION ALL -- 表B数据示例 SELECT id, name, age FROM table_b;
这样两个来源的数据就能合并成统一字段的结果集,方便后续处理。
利用JSON函数统一结构
如果数据库支持JSON类型,可以先将数组结构列转成JSON,再使用函数补全缺失键,最后展开。
PostgreSQL中的处理
SELECT
(json_data->>'id') AS id,
(json_data->>'name') AS name,
(json_data->>'age') AS age
FROM (
SELECT jsonb_set(to_jsonb(a), '{age}', 'null') AS json_data
FROM table_a a
UNION ALL
SELECT to_jsonb(b) AS json_data
FROM table_b b
) t;
上面的代码把表A缺失的age字段补成null,再和表B一起输出为统一字段。
在应用层合并
有时在SQL里处理不够灵活,也可以在代码里完成。下面用Python演示如何合并不同字段的字典列表。
def merge_arrays(list_a, list_b):
# 收集所有出现的字段
keys = set()
for item in list_a + list_b:
keys.update(item.keys())
result = []
for item in list_a + list_b:
# 缺失字段补None
row = {k: item.get(k, None) for k in keys}
result.append(row)
return result
a = [{'id': 1, 'name': 'x'}]
b = [{'id': 2, 'name': 'y', 'age': 10}]
print(merge_arrays(a, b))
方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| UNION ALL补空 | 简单直观,数据库原生支持 | 字段多时SQL冗长 |
| JSON函数 | 结构灵活,适合半结构化数据 | 依赖数据库JSON能力 |
| 应用层合并 | 逻辑可控,易扩展 | 数据传输量大时效率低 |
根据业务场景选择合适的做法,就能平稳地合并具有不同字段的数组结构列。