在 Postgres JSONB 中附加键值对的简单方法
Simply way to append a key-value pair in Postgres JSONB
我正在尝试编写更新语句以将键值对添加到嵌套的 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 是否提供了一种更简单的方法来做我想做的事情?给定一条路径,我想向其中添加一个或多个键值对(如果对象尚不存在,则在路径中创建对象)。
您可以使用
中描述的功能
update orders
set info = jsonb_recursive_merge(info, '{"a": {"b1": {"key": "val"}}}');
我正在尝试编写更新语句以将键值对添加到嵌套的 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 是否提供了一种更简单的方法来做我想做的事情?给定一条路径,我想向其中添加一个或多个键值对(如果对象尚不存在,则在路径中创建对象)。
您可以使用
update orders
set info = jsonb_recursive_merge(info, '{"a": {"b1": {"key": "val"}}}');