如何在 Postgres 中转换嵌套在另一个数组内的对象内的 JSON 数组?
How to transform a JSON array nested inside an object inside another array in Postgres?
我正在使用 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
;
创建一个辅助函数来简化相当复杂的操作:
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
;
我正在使用 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
;
创建一个辅助函数来简化相当复杂的操作:
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
;