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

PostgreSQL中从JSON数组提取contactId并返回列表求助

PostgreSQL从JSON数组提取contactId并生成新数组

问题分析

你尝试直接对contactList数组使用->> 'contactId'提取值,但这个操作仅适用于单个JSON对象,而contactList是JSON数组,因此无法直接获取到每个元素的contactId,导致查询返回空结果。

解决方案

以下提供两种可行的实现方式,根据你的contact字段类型(json或jsonb)选择对应方法:

方法1:展开数组再聚合(兼容PostgreSQL 9.3+)

先将contactList数组拆分为单个JSON对象,提取每个对象的contactId,再通过聚合函数重新组合为数组:

-- 若字段为jsonb类型,将json_array_elements替换为jsonb_array_elements
SELECT 
  json_agg(contact_item ->> 'contactId') AS contact_list
FROM users,
     json_array_elements(contact -> 'contactList') AS contact_item
GROUP BY users.id; -- 用users表的主键分组,确保对应原表每一行的结果

如果你的表没有主键,可临时用ctid分组(不推荐长期使用):

SELECT 
  json_agg(contact_item ->> 'contactId') AS contact_list
FROM users,
     json_array_elements(contact -> 'contactList') AS contact_item
GROUP BY users.ctid;

如果需要将contactId转为数字类型(去掉引号),可以添加类型转换:

SELECT 
  json_agg((contact_item ->> 'contactId')::int) AS contact_list
FROM users,
     json_array_elements(contact -> 'contactList') AS contact_item
GROUP BY users.id;

方法2:使用JSON Path函数(PostgreSQL 12+推荐)

PostgreSQL 12及以上版本支持JSON Path语法,可直接提取数组中所有指定字段并返回新数组,写法更简洁:

-- json类型用json_path_query_array,jsonb类型用jsonb_path_query_array
SELECT 
  json_path_query_array(contact, '$.contactList[*].contactId') AS contact_list
FROM users;

同样,若要转为数字数组,可在Path表达式中添加类型转换:

SELECT 
  json_path_query_array(contact, '$.contactList[*].contactId.int()') AS contact_list
FROM users;

结果验证

执行上述查询后,会得到你期望的结果:

contact_list
    ------------
1  ["11111", "11112", "11113"]
2  ["21111", "21112", "21113"]

(若使用数字转换,结果会是[11111, 11112, 11113])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:10:55