PostgreSQL:如何从JSONB数组中移除键a值为x的对象?
PostgreSQL移除JSONB数组中指定对象的方法
要移除test表data字段JSONB数组中所有包含键"a"且值为"x"的对象,这里提供两种实用的实现方式:
方法一:展开数组过滤后聚合
通过拆分数组元素、筛选保留项、重新聚合的方式实现:
UPDATE test SET data = ( SELECT jsonb_agg(elem) FROM jsonb_array_elements(data) elem WHERE elem @> '{"a": "x"}' IS NOT TRUE ) WHERE id = 1; -- 如需更新全表可删除此WHERE条件
jsonb_array_elements(data):将JSONB数组拆分为单个元素elem @> '{"a": "x"}':判断元素是否包含目标键值对,取反后保留不需要移除的元素jsonb_agg(elem):将筛选后的元素重新聚合成JSONB数组
方法二:使用JSON路径直接筛选
利用PostgreSQL的JSON路径功能,更简洁地完成筛选:
UPDATE test SET data = jsonb_path_query_array(data, '$[*] ? (@.a != "x" || !exists(@.a))') WHERE id = 1;
$[*]:遍历数组中的所有元素? (@.a != "x" || !exists(@.a)):筛选出两种元素:要么a的值不是x,要么元素本身不存在a键jsonb_path_query_array:直接返回符合条件的元素组成的新数组
验证结果
执行更新后,查询验证:
SELECT data FROM test WHERE id = 1;
返回结果应为:[{"c": "y", "b": "b"}]
内容的提问来源于stack exchange,提问作者D. O.
相关产品推荐
相关产品推荐

