Простой способ добавить пару ключ-значение в Postgres JSONB - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь написать инструкцию UPDATE для добавления пар ключ-значение во вложенный путь JSON.

Прямо сейчас мой метод заключается в использовании оператора CASE.Например, если я хочу добавить пару ключ-значение {key: val} в путь a-> b1 ...

UPDATE orders SET info = jsonb_set(info, '{a}',                                                -- adds to the a->b1 key (chain created if not exists)
    CASE
    WHEN info->'a' IS NULL THEN '{"b1": {"key": "val"}}'
    WHEN info->'a'->'b1' IS NULL THEN jsonb_set(info->'a', '{b1}', '{"key": "val"}', true)
    ELSE jsonb_set(info->'a', '{b1}', info->'a'->'b1' || '{"key": "val"}', true)
    END,
    true);

Вышеприведенный оператор работает ...

  • Если a не существует, он создаст a с {b1: {key: val}}.
  • Если a-> b1 не существует, он создаст a-> b1и установите для него значение {key: val}.
  • Если a-> b1 существует, он захватит a-> b1 и добавит в него {key: val}.

, но писать и понимать утомительно.Предоставляет ли Postgres более простой способ сделать то, что я пытаюсь сделать?Учитывая путь, я хочу добавить в него одну или несколько пар ключ-значение (создание объектов в пути, если они еще не существуют).

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете использовать функцию, описанную в Слияние значений JSONB в PostgreSQL?

update orders 
set info = jsonb_recursive_merge(info, '{"a": {"b1": {"key": "val"}}}');

Проверить это в rextester.

...