将数组的所有元素循环到jsonb并删除键



我有一个postgresql表与jsonbdetails。该列的一个字段包含一个名称为ranges的数组。我需要为这个数组的每个元素删除键unit。但是,这些字段也可以为空。数组可以是任意大小。

jsonb示例:

{
"ranges": [
{
"...": {...},
"areaRange": {
"unit": "SQUARE",
"...": {...}
}
},
{
"...": {...},
"areaRange": {
"unit": "SQUARE_2",
"range": {...}
}
},
{
"areaRange": {
"unit": null
}
},
{
"areaRange": null
}
],
"...": {...}
}

jsonb_array_elements循环遍历数组中的所有元素。

要从对象的对象中删除一个元素,可以使用#-:jsonb (ranges) #- '{areaRange,unit}'

jsonb_set更新json.

UPDATE table_name t
SET details = jsonb_set(t.details::jsonb, '{ranges}', s.range_updated::jsonb)
FROM (
SELECT details,
jsonb_agg(
jsonb (ranges) #- '{areaRange,unit}'
) as range_updated
FROM table_name ,
jsonb_array_elements(details -> 'ranges') as ranges
GROUP BY details
) s
WHERE t.details = s.details ;
SELECT jsonb_pretty(details) FROM table_name

结果:

{
    "ranges": [
        {
            "areaRange": {
                "range": {
                    "to": 25.399999618530273,
                    "from": 24.360000610351562
                }
            }
        },
        {
            "areaRange": {
                "range": {
                    "to": 44.560001373291016,
                    "from": 31.969999313354492
                }
            }
        },
        {
            "areaRange": {
                "range": {
                    "to": null,
                    "from": null
                }
            }
        },
        {
            "areaRange": {
            }
        },
        {
            "areaRange": null
        }
    ]
}

演示

最新更新