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

时间:2019-11-11 13:27:34

标签: postgresql

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

1 个答案:

答案 0 :(得分:1)

step-by-step demo: 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对象。