我有一个postgresql表与jsonb
列details
。该列的一个字段包含一个名称为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
}
]
}
演示