PostgreSQL: обновление нескольких внутренних полей jsonb-объектов с одинаковыми именами - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть таблица с именем test, которая имеет 2 столбца: (id int, md jsonb). md столбец может содержать данные, подобные этому

{
  "a": {
    ...
    "author": "alice"
    ...
  },
  "b": {
    ...
    "author": "alice"
    ...
  }
}

Теперь я хочу обновить все экземпляры alice до bob.

Я получил идентификаторы строк, содержащих alice, выполнив

select id from test, lateral jsonb_each(md) where md->>'author' = 'alice';

Существуют ли средства Postgres для обновления каждого внутреннего объекта, который содержит поле author?

Любые предложения приветствуются.

1 Ответ

1 голос
/ 26 апреля 2019

Я согласен с @a_horse_with_no_name, что лучше проверить вашу память. Но это интересно сделать как упражнение. Я думаю, что единственный способ сделать это - расширить json с помощью jsonb_each, обновить данные с помощью jsonb_set, а затем агрегировать их обратно с jsonb_object_agg :

update test as t set
    md = (
    select
        jsonb_object_agg(
            d.key,
            case
                when d.value->>'author' = 'alice' then
                    jsonb_set(d.value, '{author}', '"bob"')
                else
                    d.value
            end
        )
     from lateral jsonb_each(t.md) as d
    )
where
    exists (select * from jsonb_each(t.md) as d where d.value->>'author' = 'alice')

db<>fiddle demo

...