首页 > 解决方案 > 从 postgresql 中的 jsonb 嵌套数组中删除键值对

问题描述

我有 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 键。是否有一个查询来执行此操作?

标签: postgresql

解决方案


分步演示: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 数组分别展开为一行(分隔要从中删除c元素的聚合 JSON 对象)
  3. 您可以使用-运算符来删除元素。
  4. 要重新聚合原始 JSON 对象,您需要将其向后分组。jsonb_agg()重新聚合数组
  5. 最后,您需要jsonb_object_agg()使用先前生成的键列和新的数组列重建原始 JSON 对象。

推荐阅读