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

PostgreSQL 15.4:如何解析JSON数组并聚合生成TEXT类型技能列?

PostgreSQL 15.4 提取JSON数组字段并聚合为目标格式

场景说明

环境:PostgreSQL 15.4

现有表table1的创建语句:

CREATE TABLE table1 (
 id INT PRIMARY KEY,
 name TEXT,
 skills JSON
);

已插入的测试数据:

INSERT INTO table1 (id, name, skills) VALUES
 (1, 'Alice', '[
                 {"sid" : 11, "description" : "Cardio"}, 
                 {"sid" : 13, "description" : "Anesthist"}
              ]'
 ),
 (2, 'Bob', '[
               {"sid" : 10, "description" : "Gastro"}, 
               {"sid" : 9, "description" : "Oncology"}
              ]'
 ),
 (3, 'Sam', '[]'
 );

期望查询结果(skill列为TEXT类型):

id   name     skill
---------------------
1   Alice     ["Cardio","Anesthist"]
2   Bob       ["Gastro","Oncology"]
3   Sam       []

问题分析

之前尝试的查询语句:

select  
id, name, d ->> 'description' as skill 
from table1, 
json_array_elements(skills) as d

该语句用隐式CROSS JOIN拆分JSON数组,导致生成重复行;同时当skills为空数组时,无匹配结果,Sam的记录会被过滤,不符合预期。

解决方案

方法一:LEFT JOIN LATERAL + json_agg

SELECT
  id,
  name,
  json_agg(d->>'description')::TEXT AS skill
FROM table1
LEFT JOIN LATERAL json_array_elements(skills) AS d ON true
GROUP BY id, name;
  • LEFT JOIN LATERAL保证空数组的记录不会被过滤;
  • json_agg()将提取到的所有description值聚合为JSON数组,再转为TEXT类型。

方法二:JSON路径函数(PostgreSQL 12+)

SELECT
  id,
  name,
  json_path_query_array(skills, '$[*].description')::TEXT AS skill
FROM table1;
  • json_path_query_array直接从JSON数组中提取所有description字段的值,组成新的JSON数组,语法更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:13:29