PostgreSQL 9.6从tbl表生成map表多行数据的技术问询
PostgreSQL 9.6 实现数组拆分行并插入目标表
需求说明
现有tbl表包含name、in1、in2(数组类型)字段,数据如下:
- name='a':in1=1,in2为空
- name='b':in1=2,in2='{3}'
- name='c':in1=4,in2='{5,6}'
- name='d':in1=7,in2='{8,9,10}'
需要生成map表(含name、out1、out2字段),要求:
- 每个
name对应in1生成一行:out1=in1,out2=in1 - 每个
name的in2数组中每个元素单独生成一行:out1=in1,out2=数组元素
解决方案
使用PostgreSQL内置的unnest()函数拆分数组,配合UNION ALL合并两种行数据,一次性完成插入操作,无需分两次执行插入和更新:
INSERT INTO map(name, out1, out2) -- 生成in1对应的行 SELECT name, in1, in1 FROM tbl UNION ALL -- 拆分in2数组生成对应行 SELECT name, in1, unnest(in2) FROM tbl -- 过滤掉in2为空的情况,避免生成无效行 WHERE in2 IS NOT NULL AND array_length(in2, 1) > 0;
代码说明
unnest(in2):将数组in2的每个元素拆分为单独的行,每行对应一个数组元素UNION ALL:合并两部分查询结果,保留所有行(此处无重复场景)WHERE in2 IS NOT NULL AND array_length(in2, 1) > 0:避免in2为空或空数组时生成多余空行
执行以上SQL后,map表的最终数据如下:
| name | out1 | out2 |
|---|---|---|
| a | 1 | 1 |
| b | 2 | 2 |
| b | 2 | 3 |
| c | 4 | 4 |
| c | 4 | 5 |
| c | 4 | 6 |
| d | 7 | 7 |
| d | 7 | 8 |
| d | 7 | 9 |
| d | 7 | 10 |
内容的提问来源于stack exchange,提问作者Daniel Powley
相关产品推荐
相关产品推荐

