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

PostgreSQL:将JSON数组转换为按ID索引的单个JSON

将JSONB数组转换为以ID为键的JSONB对象

在PostgreSQL中,你可以通过拆分JSONB数组+聚合函数的方式实现这个转换,核心用到jsonb_array_elements(拆分数组元素)和jsonb_object_agg(聚合生成键值对对象)。

直接查询示例

假设你有一个JSONB数组变量或字段,执行以下SQL即可得到目标结构:

SELECT jsonb_object_agg((elem->>'id')::text, elem)
FROM jsonb_array_elements('[{"id": 1, "name": "John"}, {"id": 2, "name": "Jane"}]'::jsonb) AS elem;

封装为可复用的SQL函数

如果要在自定义SQL函数中复用该逻辑,可以写成:

CREATE OR REPLACE FUNCTION array_to_id_keyed_jsonb(arr jsonb)
RETURNS jsonb AS $$
BEGIN
  RETURN (
    SELECT jsonb_object_agg((elem->>'id')::text, elem)
    FROM jsonb_array_elements(arr) AS elem
  );
END;
$$ LANGUAGE plpgsql;

调用函数时只需传入目标数组:

SELECT array_to_id_keyed_jsonb('[{"id":1,"name":"John"},{"id":2,"name":"Jane"}]'::jsonb);

注意事项

  • 如果数组中存在重复ID,jsonb_object_agg会自动保留最后一个出现的元素(后出现的覆盖先出现的)。
  • 确保数组中每个元素都包含id字段,否则会出现键为null的条目;若需过滤无id的元素,可在查询中添加WHERE elem ? 'id'条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:42:06