PostgreSQL JSONB数组更新:修改subsectionid=27的cc字段值
解决PostgreSQL JSONB数组特定元素字段更新问题
针对你的需求——更新JSONB数组中subsectionid=27的元素的cc字段,正确的SQL语句如下:
UPDATE jsondata SET data = jsonb_set( data, -- 构建目标字段的路径:数组索引 + cc字段名 ARRAY[( SELECT idx::text FROM jsonb_array_elements(data) WITH ORDINALITY arr(elem, idx) WHERE elem->>'subsectionid' = '27' ), 'cc'], '["Lake Providence"]'::jsonb -- 要设置的cc字段值 ) -- 仅更新包含目标元素的行,避免无意义的更新操作 WHERE EXISTS ( SELECT 1 FROM jsonb_array_elements(data) elem WHERE elem->>'subsectionid' = '27' );
原有语句的问题说明:
- WHERE条件无效:
data->>'subsectionid' = '27'直接对整个JSONB数组使用->>操作符,无法提取数组内部元素的subsectionid值,因此不会匹配到任何数据行。 - 更新逻辑错误:
data || '{null: ["Lake Providence"]}'::jsonb是将新的JSON对象追加到数组末尾,而非修改数组中已存在的目标元素。
执行上述正确语句后,通过SELECT * from jsondata;即可验证:subsectionid=27的元素的cc字段已成功更新为["Lake Providence"]。
内容的提问来源于stack exchange,提问作者Amol Naik
相关产品推荐
相关产品推荐

