You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段),要求:

  1. 每个name对应in1生成一行:out1=in1,out2=in1
  2. 每个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表的最终数据如下:

nameout1out2
a11
b22
b23
c44
c45
c46
d77
d78
d79
d710

内容的提问来源于stack exchange,提问作者Daniel Powley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:40:18