任务是从jsonb
字段中删除多个嵌套键。
是否可以在不编写自定义函数的情况下缩短此表达式?
SELECT jsonb '{"a": {"b":1, "c": 2, "d": 3}}' #- '{a,b}' #- '{a,d}';
假设我们需要删除2个以上的键
答案 0 :(得分:3)
无法缩短表达式。如果您的目标是将单个键数组传递给查询,则可以将jsonb_set()
与jsonb_each()
一起使用:
with my_table(json_col) as (
values
(jsonb '{"a": {"b":1, "c": 2, "d": 3}}')
)
select jsonb_set(json_col, '{a}', jsonb_object_agg(key, value))
from my_table
cross join jsonb_each(json_col->'a')
where key <> all('{b, d}') -- input
group by json_col -- use PK here if exists
jsonb_set
-----------------
{"a": {"c": 2}}
(1 row)
该解决方案显然更昂贵,但在处理许多要删除的密钥时可能很方便。
答案 1 :(得分:1)
NVM,找出来)
对于这种特殊情况,我们可以使用移除的键(平键)重新分配属性:
SELECT jsonb_build_object('a', ('{ "b":1, "c": 2, "d": 3 }' - ARRAY['b','d']));
更一般的方法:
SELECT json_col || jsonb_build_object('<key>',
((json_col->'<key>') - ARRAY['key-1', 'key-2', 'key-n']));
对于深层路径不是很有用,但可以与1级嵌套一起使用。