在Postgres JSONB

时间:2018-11-27 22:01:33

标签: postgresql jsonb

我正在尝试编写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不存在,它将使用{b1:{key:val}}}创建一个。
  • 如果a-> b1不存在,它将创建a-> b1并将其设置为{key:val}。
  • 如果确实存在a-> b1,它将抓取a-> b1并在其中附加{key:val}。

,但是编写和理解很繁琐。 Postgres是否提供一种更简便的方法来执行我要执行的操作?给定一个路径,我想在其中添加一个或多个键值对(如果尚不存在,则在路径中创建对象)。

1 个答案:

答案 0 :(得分:2)

您可以使用Merging JSONB values in PostgreSQL?

中描述的功能
update orders 
set info = jsonb_recursive_merge(info, '{"a": {"b1": {"key": "val"}}}');

Test it in rextester.