如何在PostgreSQL中将指定结构的数组转换为目标格式对象?
PostgreSQL中将数组对象转换为键值映射对象的实现方法
要把输入的JSON数组转换为以name字段值为键、剩余字段组成的对象为值的映射结构,可以利用PostgreSQL的JSON聚合函数实现,具体如下:
基础实现(输入为JSONB数组)
假设你的输入是JSONB类型的数组,直接使用jsonb_to_recordset拆分数组为行,再通过jsonb_object_agg聚合生成目标对象:
SELECT jsonb_object_agg(elem.name, elem - 'name') AS transformed_result FROM jsonb_to_recordset('[{"name":"a","test":1},{"name":"b","test":2}]'::jsonb) AS elem(name text, test int);
代码说明
jsonb_to_recordset('...'::jsonb):将JSON数组拆分为结构化的行记录,这里指定了name(文本类型)和test(整数类型)两个字段,需和数组元素的键对应。elem - 'name':从每个JSON对象中移除name键,得到仅包含test的子对象。jsonb_object_agg(elem.name, elem - 'name'):将行中的name值作为键,处理后的子对象作为值,聚合生成最终的映射JSON对象。
处理文本类型输入
如果你的输入是文本格式的JSON字符串,只需先转换为JSONB类型即可,用法和上面一致:
SELECT jsonb_object_agg(elem.name, elem - 'name') AS transformed_result FROM jsonb_to_recordset('[ {"name":"a","test":1}, {"name":"b","test":2} ]'::jsonb) AS elem(name text, test int);
注意事项
如果数组中存在重复的name值,jsonb_object_agg会自动保留最后出现的那个元素对应的对象,覆盖之前的重复键。
内容的提问来源于stack exchange,提问作者Hiep Phan Quang
相关产品推荐
相关产品推荐

