我有一个表,表中有一列jsonb对象,它们看起来很相似,但是每行中都有不同的顶级键。每条记录看起来都是这样,但是具有不同的顶级键:
{
"10": {
"key": "value",
"toDelete": "value"
},
"42": {
"key": "value",
"toDelete": "value"
},...
}
我需要进行更新,以从每一行的每个记录中的每个对象中删除toDelete
键/值。使用#-
运算符手动删除每个键很容易,但是每个记录中可能有成百上千个顶级键,因此我需要某种动态解决方案。我尝试将要删除的所有路径汇总到一个数组中,并使用column #- array
一次删除所有路径,其中数组看起来像{{10, toDelete},{42,toDelete}...}
,但没有成功。
答案 0 :(得分:1)
json列的结构是反模式,我完全同意@mvp的评论:
...您应该考虑从json提取数据,并将其存储在真实的SQL表中。
如果您被迫使用原始数据,请使用以下功能:
create or replace function remove_nested_object(obj jsonb, key_to_remove text)
returns jsonb language sql immutable as $$
select jsonb_object_agg(key, value- key_to_remove)
from jsonb_each(obj)
$$;
update my_table
set json_column = remove_nested_object(json_column, 'toDelete')
where json_column::text like '%"toDelete":%';