PostgreSQL 15.1如何从JSONB数组中移除指定元素?
移除JSONB数组中指定ID元素的PostgreSQL函数
针对你的需求,这里提供一个适配PostgreSQL 15.1的函数,可接收JSONB数组和要移除的ID参数,返回过滤后的数组:
CREATE OR REPLACE FUNCTION remove_jsonb_element(p_jsonb jsonb, p_remove_id integer) RETURNS jsonb AS $$ BEGIN RETURN ( SELECT jsonb_agg(elem) FROM jsonb_array_elements(p_jsonb) AS elem WHERE (elem->>'id')::integer != p_remove_id ); END; $$ LANGUAGE plpgsql IMMUTABLE;
函数逻辑说明
jsonb_array_elements(p_jsonb):将输入的JSONB数组拆分为单个元素的行集合(elem->>'id')::integer:提取每个元素的id字段(先转为文本再转整数,确保类型匹配)WHERE子句:过滤掉ID等于目标值的元素jsonb_agg(elem):将剩余元素重新聚合为JSONB数组
用法示例
传入你提供的原始JSONB数据和要移除的ID(102):
SELECT remove_jsonb_element( '[ {"id":101,"content":"lorem ipsum", "username":"user_1"}, {"id":102,"content":"lorem ipsum", "username":"user_2"}, {"id":103,"content":"lorem ipsum", "username":"user_3"} ]'::jsonb, 102 );
执行后将返回预期结果:
[ {"id":101,"content":"lorem ipsum", "username":"user_1"}, {"id":103,"content":"lorem ipsum", "username":"user_3"} ]
表列场景使用
如果JSONB数据存储在表列中,可直接在查询中调用函数:
SELECT remove_jsonb_element(your_jsonb_column, 102) AS filtered_data FROM your_table;
补充说明
你之前尝试jsonb_array_elements未成功,大概率是因为拆分元素后没有用jsonb_agg重新聚合为数组,导致返回单个元素行而非完整数组。
内容的提问来源于stack exchange,提问作者Karthik S K
相关产品推荐
相关产品推荐

