如何转换嵌套在Postgres中另一个数组内的对象内的JSON数组?

时间:2018-10-01 04:49:43

标签: arrays json postgresql jsonb

我正在使用Postgres 9.6,并具有一个名为credits的JSON字段,其结构如下:信用列表,每个信用都有一个职位,并且可以有多个人担任该职位。

[
  {
    "position": "Set Designers",
    people: [
      "Joe Blow",
      "Tom Thumb"
    ]
  }
]

我需要将嵌套的people数组(目前只是表示其名称的字符串)转换为具有nameimage_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
;

1 个答案:

答案 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
;

Working example in rextester.