如何在PostgreSQL中删除嵌套JSON数组内的指定键值对
方案说明
PostgreSQL 针对JSON类型字段的嵌套数组元素删键操作,可以通过「拆分数组→逐元素处理→重新聚合→替换原字段」的逻辑实现,以下是不同场景的可用写法:
场景1:fields字段为jsonb类型(推荐PostgreSQL 9.5+使用)
仅查询验证处理结果
SELECT jsonb_set( fields, '{b}', (SELECT jsonb_agg(elem - 'c') FROM jsonb_array_elements(fields->'b') elem) ) AS processed_fields FROM mytable;
直接更新表内数据
UPDATE mytable SET fields = jsonb_set( fields, '{b}', (SELECT jsonb_agg(elem - 'c') FROM jsonb_array_elements(fields->'b') elem) ) -- 可自行添加WHERE条件限定更新范围,例如WHERE id = 10; ;
场景2:fields字段为json类型
原生json类型不支持-删键操作符,需要先转jsonb处理完成后再转回json类型:
-- 查询示例 SELECT json_set( fields, '{b}', (SELECT json_agg((elem::jsonb - 'c')::json) FROM json_array_elements(fields->'b') elem)::json ) AS processed_fields FROM mytable; -- 更新示例 UPDATE mytable SET fields = json_set( fields, '{b}', (SELECT json_agg((elem::jsonb - 'c')::json) FROM json_array_elements(fields->'b') elem)::json );
扩展说明
如果需要同时删除多个键,可链式调用删键操作符,比如同时删除c和d可以写为elem - 'c' - 'd'。
内容的提问来源于stack exchange,提问作者Jason KIM
相关产品推荐
相关产品推荐

