在PostgreSQL中从jsonb嵌套数组中删除键值对。

3

我有一些jsonb数据,如下所示:

{
  "a":[
    {"b":1,"c":2,"d":3},
    {"b":4,"c":5,"d":6}
  ],
  "g":[
    {"b":1,"c":2,"d":3},
    {"b":4,"c":5,"d":6}
  ]
}

我想从嵌套数组的"a"和"g"键中删除c键。是否有单个查询可以执行此操作?


不确定你能否按原样更新它(除非你为此创建一个特定的函数)。你可以通过扩展它、删除不必要的元素并重新聚合它来重新创建你的jsonb - https://dbfiddle.uk/?rdbms=postgres_12&fiddle=d1e8617aa77195ffb6cbe8a0da73af50 - Roman Pekar
1个回答

2

逐步演示:db<>fiddle

SELECT
    jsonb_object_agg(key, a)                                -- 5
FROM (
    SELECT
        mydata,
        key,
        jsonb_agg(a_elems.value - 'c') as a                   -- 3/4
    FROM
        mytable,
        jsonb_each(mydata) elems,                             -- 1
        jsonb_array_elements(elems.value) AS a_elems          -- 2
    GROUP BY mydata, key                                      -- 4
) s
GROUP BY mydata                                               -- 5
  1. 将JSON元素扩展为每行一个。这将生成两列:一个是键,一个是值(JSON数组)
  2. 将JSON数组扩展为每行一个(这将分离出聚合的JSON对象,您要从中删除 c 元素)
  3. 您可以使用-运算符来删除元素。
  4. 要重新聚合原始JSON对象,需要向后分组。 jsonb_agg() 重新聚合数组
  5. 最后,您需要使用jsonb_object_agg() 使用先前生成的键列和新数组列重建原始JSON对象。

1
OP有jsonb数据,所以你可能希望将所有这些json_*函数更改为它们对应的jsonb_*函数。 - GMB
1
@GMB 谢谢。我真的错过了。已更改! - S-Man
现在看起来不错。请随意将此数据库示例添加到您的回答中。 - GMB
看起来不错。但是我正在使用Postgres 9.4版本。我们如何在这个版本中实现相同的结果?根据文档,jsonb_agg函数不存在。 - Santhosh Chandrasekharan
你可以将其转换为json类型,然后使用json_agg函数。在以前的版本中,我是用json类型来做这个的。https://dbfiddle.uk/?rdbms=postgres_12&fiddle=274ab5f920d31893d2914c5e6e5a18c5 - S-Man
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接