PostgreSQL:移除jsonb列ranges数组元素的unit键需求
PostgreSQL移除jsonb数组元素中的指定键(处理null场景)
要批量移除details列(jsonb类型)中ranges数组每个元素里areaRange下的unit键,同时兼容areaRange为null、unit为null或数组长度不固定的情况,可以用PostgreSQL的jsonb系列函数实现:
核心更新语句
假设你的表名为your_table,执行以下SQL即可完成更新:
UPDATE your_table SET details = jsonb_set( details, '{ranges}', ( SELECT jsonb_agg( jsonb_delete_path(range_elem, '{areaRange, unit}') ) FROM jsonb_array_elements(details->'ranges') AS range_elem ) ) WHERE details->'ranges' IS NOT NULL;
语句说明
- 拆分数组:
jsonb_array_elements(details->'ranges')将ranges数组拆分为单个元素,遍历处理每一项 - 删除指定键:
jsonb_delete_path(range_elem, '{areaRange, unit}')精准删除每个元素中areaRange下的unit键——不管areaRange是null、unit是null还是字段不存在,该函数都能安全处理,不会抛出错误 - 重组数组:
jsonb_agg(...)将处理后的单个元素重新聚合为数组 - 替换字段:
jsonb_set(...)把原details中的ranges字段替换为处理后的新数组 - 过滤条件:
WHERE details->'ranges' IS NOT NULL可选,仅更新存在ranges字段的行,避免无意义操作
验证效果(测试示例数据)
如果要先验证处理逻辑,可执行以下查询测试示例数据:
SELECT jsonb_set( sample_data, '{ranges}', ( SELECT jsonb_agg( jsonb_delete_path(range_elem, '{areaRange, unit}') ) FROM jsonb_array_elements(sample_data->'ranges') AS range_elem ) ) AS processed_data FROM ( SELECT '{ "ranges": [ { "otherField": "test", "areaRange": { "unit": "SQUARE", "min": 10 } }, { "areaRange": { "unit": "SQUARE_2", "range": {"start": 5} } }, { "areaRange": { "unit": null } }, { "areaRange": null } ], "other": "data" }'::jsonb AS sample_data ) AS t;
执行后会返回处理后的jsonb数据,其中所有ranges元素的areaRange下均无unit键。
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

