如何将特定值从JSON列中的一个字段移动到PostgreSQL中的另一个字段?

vs91vp4v  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(455)

让我们假设我有一个表users,它有一个JSON列“foo”。该列的值如下所示:

"{ field1: ['bar', 'bar2', 'bar3'], field2: ['baz', 'baz2', 'baz3'] }"

其中field1和field2是可选的,因此列值可能如下所示:"{}"
我想将此表中所有记录的值'bar2'和'bar3'从field1移动到field2。
样本输出:

"{ field1: ['bar'], field2: ['baz', 'baz2', 'baz3', 'bar2', 'bar3']}"

更多示例:

"{ field1: ['bar3'], field2: ['baz', 'baz2', 'baz3'] }"

应该转变成

"{ field1: [], field2: ['baz', 'baz2', 'baz3', 'bar3'] }"

等等的。
有什么办法可以做到这一点吗?
不幸的是,我不知道如何处理这个问题。

mgdq6dx1

mgdq6dx11#

jsonb_array_elements中使用一系列子查询

select jsonb_build_object('field1', coalesce((select jsonb_agg(v.value) 
       from jsonb_array_elements(u.foo -> 'field1') v 
       where v.value#>>'{}' not in ('bar2', 'bar3')), '[]'::jsonb),
   'field2', (u.foo -> 'field2') || (select jsonb_agg(v.value) 
       from jsonb_array_elements(u.foo -> 'field1') v 
       where v.value#>>'{}' in ('bar2', 'bar3'))) 
from users u 
where u.foo ? 'field1' and u.foo ? 'field2'

See fiddle

相关问题