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

PostgreSQL合并多数组列并转换为指定格式JSON的查询方法

解决PostgreSQL数组转嵌套JSON数组的问题

问题背景

现有PostgreSQL表test_table,结构如下:

create table test_table
(
  id            integer ,
  name          varchar(50),
  dob           date,
  user_id       int[],
  title         varchar[]
);

表中数据:

idnamedobuser_idtitle
1John1990-11-17{123,456}{Manager1,Manager2}

需要查询生成指定格式的JSON,但原查询中Links部分不符合预期,原查询语句:

select json_build_object('section1', json_build_object('ID', id),
                         'section2', json_build_object('Name', name),
                         'Date of Birth', dob,
                          'Links', json_build_array(json_build_object('UserId', user_id,
                                                                      'Title', title
                                                                     ) 
                                                   )
                       ) from test_table;

问题原因

原查询直接将整个user_id和title数组传入json_build_object,导致生成的是包含数组的对象,而非将两个数组的元素一一配对生成对象数组。

正确查询方法

需要使用unnest同时展开两个数组,将对应位置的元素配对,再通过json_agg聚合生成目标数组:

select 
  json_build_object(
    'section1', json_build_object('ID', t.id),
    'section2', json_build_object('Name', t.name),
    'Date of Birth', t.dob,
    'Links', (
      select json_agg(json_build_object('UserId', u.user_id, 'Title', u.title))
      from unnest(t.user_id, t.title) as u(user_id, title)
    )
  ) as result_json
from test_table t;

说明

  • unnest(t.user_id, t.title)会将两个数组按索引位置一一对应展开,生成每行包含一个user_id和对应title的临时结果集
  • json_agg将临时结果集中的每个json_build_object生成的对象聚合为JSON数组
  • 外层的json_build_object组合所有部分得到最终的JSON结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:20:54