从 PostgreSQL 中具有未知键的多个嵌套 jsonb 对象中删除键
Remove key from multiple nested jsonb objects with unknown keys in PostgreSQL
我有一个 table,其中有一列看起来相似的 jsonb 对象,但每一行都有不同的顶级键。每条记录看起来像这样,但具有不同的顶级键:
{
"10": {
"key": "value",
"toDelete": "value"
},
"42": {
"key": "value",
"toDelete": "value"
},...
}
我需要进行更新以从每一行的每条记录中的每个对象中删除 toDelete
key/value。使用 #-
运算符手动删除每个键非常容易,但每条记录中可能有数百甚至数千个顶级键,因此我需要某种动态解决方案。我尝试将所有要删除的路径聚合到一个数组中,并使用 column #- array
一次删除所有路径,其中数组看起来像 {{10, toDelete},{42,toDelete}...}
但这没有成功。
json列的结构是一个反模式,我完全同意@mvp的评论:
... you should consider extracting your data from json and store it in real SQL table(s) instead.
如果您被迫使用原始数据,请使用函数:
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":%';
我有一个 table,其中有一列看起来相似的 jsonb 对象,但每一行都有不同的顶级键。每条记录看起来像这样,但具有不同的顶级键:
{
"10": {
"key": "value",
"toDelete": "value"
},
"42": {
"key": "value",
"toDelete": "value"
},...
}
我需要进行更新以从每一行的每条记录中的每个对象中删除 toDelete
key/value。使用 #-
运算符手动删除每个键非常容易,但每条记录中可能有数百甚至数千个顶级键,因此我需要某种动态解决方案。我尝试将所有要删除的路径聚合到一个数组中,并使用 column #- array
一次删除所有路径,其中数组看起来像 {{10, toDelete},{42,toDelete}...}
但这没有成功。
json列的结构是一个反模式,我完全同意@mvp的评论:
... you should consider extracting your data from json and store it in real SQL table(s) instead.
如果您被迫使用原始数据,请使用函数:
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":%';