PostgreSQL jsonb-省略多个嵌套键

时间:2019-05-06 12:39:45

标签: postgresql jsonb

任务是从jsonb字段中删除多个嵌套键。

是否可以在不编写自定义函数的情况下缩短此表达式?

SELECT jsonb '{"a": {"b":1, "c": 2, "d": 3}}' #- '{a,b}' #- '{a,d}';
  

假设我们需要删除2个以上的键

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级嵌套一起使用。