PostgreSQL中如何更新JSON数组内的JSON对象值?
PostgreSQL jsonb数组更新:修改指定键值的正确SQL语句
错误原因
报错ERROR: path element at position 1 is not an integer: "2023-03-01"是因为你的列是jsonb数组类型,数组的路径定位必须使用整数索引(对应数组元素的位置),而你直接将字符串键"2023-03-01"作为路径元素,不符合数组的路径规则。
解决方案
根据你的需求场景,选择对应的SQL语句:
场景1:修改数组中所有对象的指定键值
如果数组内每个元素都是JSON对象,且需要把所有包含"2023-03-01"键的元素值改为true:
UPDATE your_table SET jsonb_array_col = ( SELECT jsonb_agg( CASE WHEN elem ? '2023-03-01' THEN elem || '{"2023-03-01": true}'::jsonb ELSE elem END ) FROM jsonb_array_elements(jsonb_array_col) AS elem ) WHERE mobile = '你的目标手机号';
- 逻辑:用
jsonb_array_elements展开数组,逐个检查元素是否包含目标键,包含则用||运算符覆盖键值,最后用jsonb_agg重新聚合为数组。
场景2:修改数组中特定位置元素的指定键值
如果只需要修改数组中某一个位置(比如第1个元素,索引为0)的对象键值:
UPDATE your_table SET jsonb_array_col = jsonb_set( jsonb_array_col, '{0, "2023-03-01"}', -- 0是数组元素的索引,按需修改 'true'::jsonb ) WHERE mobile = '你的目标手机号';
- 逻辑:
jsonb_set的路径参数先指定数组的整数索引,再指定对象的字符串键,这样就能准确定位到数组内对象的目标键进行修改。
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

