我正在尝试用一个新值更新一个jsonb键,但是我不能一次更新所有的键。
我的json结构是这样的:
[{
"type": "button",
"content": {
"align": "leftAlign"
}
}, {
"type": "button",
"content": {
"align": "leftAlign"
}
}, {
"type": "button",
"content": {
"align": "leftAlign"
}
}] 我想用一个新值更新align键,但是现在我的查询没有更新所有的元素,它只更新一个元素。
到目前为止,这是我的疑问:
with align_position as (
select
('{' || index-1 || ',content,align}' )::text[] as path,
id
from section, jsonb_array_elements(entities) with ordinality arr(entity, index)
where entity->'content'->>'align' = 'leftAlign'
)
update myTable set entities = jsonb_set(entities, align_position.path, '"left"', false) from align_position where section.id = align_position.id;如何使查询更新所有元素?
有什么想法吗?
发布于 2020-06-18 07:22:58
我设法使用以下查询解决了这个问题:
update
myTable
set
entities =
(
select
to_jsonb(array_agg (new_values))
from
(
select
(
case
when
arr -> 'content' ->> 'align' = 'leftAlign'
then
jsonb( COALESCE( jsonb_set(arr, '{content}', jsonb(arr ->> 'content') - 'align' || jsonb('{"align": "left"}'), true), '{}' ) )
when
arr -> 'content' ->> 'align' = 'rightAlign'
then
jsonb( COALESCE( jsonb_set(arr, '{content}', jsonb(arr ->> 'content') - 'align' || jsonb('{"align": "right"}'), true), '{}' ) )
when
arr -> 'content' ->> 'align' = 'centerAlign'
then
jsonb( COALESCE( jsonb_set(arr, '{content}', jsonb(arr ->> 'content') - 'align' || jsonb('{"align": "center"}'), true), '{}' ) )
else
arr
end
) as new_values
from
jsonb_array_elements( entities ) as arr
group by
arr -> 'content' ->> 'align',
arr
)
as new_values
)
;https://dba.stackexchange.com/questions/269169
复制相似问题