更新包含数组的 jsonb 列中的选定值
Update selected values in a jsonb column containing a array
Table faults
包含列 recacc
(jsonb),其中包含一个 json 对象数组。它们每个都包含一个字段 action
。如果 action
的值为 abc
,我想将其更改为 cba
。要应用于所有行的更改。
[
{
"action": "abc",
"created": 1128154425441
},
{
"action": "lmn",
"created": 1228154425441
},
{
"action": "xyz",
"created": 1328154425441
}
]
下面的不行,可能是因为数据是数组格式的
update faults
set recacc = jsonb_set(recacc,'{action}', to_jsonb('cbe'::TEXT),false)
where recacc ->> 'action' = 'abc'
我不确定这是否是最佳选择,但您可以先使用 jsonb_array_elements
获取 jsonb 的元素,替换它,然后使用重建 json array_agg
和 array_to_json
.
UPDATE faults SET recacc = new_recacc::jsonb
FROM
(SELECT array_to_json(array_agg(s)) as new_recacc
FROM
( SELECT
replace(c->>'action','abc','cba') , --this to change the value
c->>'created' FROM faults f
cross join lateral jsonb_array_elements(f.recacc) as c
) as s (action,created)
) m;
Table faults
包含列 recacc
(jsonb),其中包含一个 json 对象数组。它们每个都包含一个字段 action
。如果 action
的值为 abc
,我想将其更改为 cba
。要应用于所有行的更改。
[
{
"action": "abc",
"created": 1128154425441
},
{
"action": "lmn",
"created": 1228154425441
},
{
"action": "xyz",
"created": 1328154425441
}
]
下面的不行,可能是因为数据是数组格式的
update faults
set recacc = jsonb_set(recacc,'{action}', to_jsonb('cbe'::TEXT),false)
where recacc ->> 'action' = 'abc'
我不确定这是否是最佳选择,但您可以先使用 jsonb_array_elements
获取 jsonb 的元素,替换它,然后使用重建 json array_agg
和 array_to_json
.
UPDATE faults SET recacc = new_recacc::jsonb
FROM
(SELECT array_to_json(array_agg(s)) as new_recacc
FROM
( SELECT
replace(c->>'action','abc','cba') , --this to change the value
c->>'created' FROM faults f
cross join lateral jsonb_array_elements(f.recacc) as c
) as s (action,created)
) m;