我正试图编写一条更新语句,将键值对添加到嵌套的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是否提供了一种更简单的方法来做我想做的事情?给定一个路径,我想在其中添加一个或多个键值对(如果路径中的对象尚不存在,则在路径中创建这些对象)。