从PostgreSQL中具有未知密钥的多个嵌套jsonb对象中移除密钥

时间:2019-03-06 20:32:10

标签: postgresql jsonb

我有一个表,表中有一列jsonb对象,它们看起来很相似,但是每行中都有不同的顶级键。每条记录看起来都是这样,但是具有不同的顶级键:

{
   "10": {
      "key": "value",
      "toDelete": "value"
   },
   "42": {
      "key": "value",
      "toDelete": "value"
   },...
}

我需要进行更新,以从每一行的每个记录中的每个对象中删除toDelete键/值。使用#-运算符手动删除每个键很容易,但是每个记录中可能有成百上千个顶级键,因此我需要某种动态解决方案。我尝试将要删除的所有路径汇总到一个数组中,并使用column #- array一次删除所有路径,其中数组看起来像{{10, toDelete},{42,toDelete}...},但没有成功。

1 个答案:

答案 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":%';