代码之家  ›  专栏  ›  技术社区  ›  offbynull

在PostgresJSONB中附加键值对的简单方法

  •  1
  • offbynull  · 技术社区  · 7 年前

    我正试图编写一条更新语句,将键值对添加到嵌套的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不存在,它将创建一个with b1:key:val。
    • 如果不存在->b1,它将创建->b1并将其设置为键:val。
    • 如果a->b1确实存在,它将获取a->b1并在其中附加键:val。

    但是写作和理解很乏味。Postgres是否提供了一种更简单的方法来做我想做的事情?给定一个路径,我想在其中添加一个或多个键值对(如果路径中的对象尚不存在,则在路径中创建这些对象)。

    1 回复  |  直到 7 年前
        1
  •  2
  •   klin    7 年前

    您可以使用中描述的功能 Merging JSONB values in PostgreSQL?

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

    Test it in rextester.