【问题标题】:Remove nested json object from array in postgres从 postgres 的数组中删除嵌套的 json 对象
【发布时间】:2020-12-08 02:34:32
【问题描述】:

我在 postgres 中有一个 json 对象字段,具有以下形状

{
"a": {
   
},
"b": [
    {
        
    }
],
"c": {
    "d": "",
    "e": [
        {
            "id": 1234,
            "f": "",
            "g": ""
        }
    ]
}

}

我想知道如何编写一条语句,从 postgres 中 id 为 1234 的 e 数组中删除对象。 e 可以有多个对象,如果 e 数组中有多个对象,我想保留这些对象,只删除 id 为 1234 的对象。

谢谢

【问题讨论】:

  • 会一直在 c 和 e 键下吗?
  • 是的,它总是在键 c 和 e @Schwern 下

标签: sql json postgresql


【解决方案1】:

step-by-step demo:db<>fiddle

UPDATE t 
SET data = jsonb_set(data::jsonb, '{c,e}', s.new_array::jsonb)::json   -- 4
FROM (
    SELECT
        json_agg(value) as new_array                   -- 3
    FROM
        t,
        json_array_elements(data -> 'c' -> 'e')        -- 1
    WHERE value ->> 'id' != '1234'                     -- 2
) s;
  1. 要从 JSON 数组中删除某个元素,您需要将其扩展为每个数组元素的一行
  2. 删除包含您要删除的元素的记录
  3. 重新聚合 JSON 数组
  4. 如果你想在你的桌子上做一个UPDATE,你可以使用jsonb_set()函数来更新你新创建的数组的JSON元素。除非您不使用 jsonb 类型,否则您必须将 JSON 数据转换为 jsonb(并将结果返回类型 json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2020-08-02
    • 2020-12-07
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多