我正在使用Postgres 9.6,并具有一个名为credits
的JSON字段,其结构如下:信用列表,每个信用都有一个职位,并且可以有多个人担任该职位。
[
{
"position": "Set Designers",
people: [
"Joe Blow",
"Tom Thumb"
]
}
]
我需要将嵌套的people
数组(目前只是表示其名称的字符串)转换为具有name
和image_url
字段的对象,例如
[
{
"position": "Set Designers",
people: [
{ "name": "Joe Blow", "image_url": "" },
{ "name": "Tom Thumb", "image_url": "" }
]
}
]
到目前为止,我只能在父JSON数组或嵌套在单个JSON对象内的数组字段上找到执行此操作的示例。
到目前为止,这就是我所能做的,甚至正在破坏结果。
UPDATE campaigns
SET credits = (
SELECT jsonb_build_array(el)
FROM jsonb_array_elements(credits::jsonb) AS el
)::jsonb
;
答案 0 :(得分:3)
创建辅助功能以简化相当复杂的操作:
create or replace function transform_my_array(arr jsonb)
returns jsonb language sql as $$
select case when coalesce(arr, '[]') = '[]' then '[]'
else jsonb_agg(jsonb_build_object('name', value, 'image_url', '')) end
from jsonb_array_elements(arr)
$$;
使用此功能,更新并不那么可怕:
update campaigns
set credits = (
select jsonb_agg(jsonb_set(el, '{people}', transform_my_array(el->'people')))
from jsonb_array_elements(credits::jsonb) as el
)::jsonb
;