PostgreSQL更新JSON报cannot extract elements from an object错误解决
错误原因
- 根因是首次写入
json_object键时值的类型不符合预期:你的业务逻辑中json_object对应的值是JSON数组(和示例中json_object_1、json_object_2存数组的结构一致),但你在新增分支用jsonb_build_object('value', 3)直接生成了JSON对象作为值存入,导致json_object的类型变成了object而非array。 - 首次执行时走新增分支,类型错误不会触发报错;后续执行时判断
json_object键已存在,走到else分支调用jsonb_array_elements()函数——该函数仅支持入参为JSON数组,传入JSON对象时就会抛出cannot extract elements from an object错误。 - 原SQL的键存在判断逻辑
json_column = json_column - 'json_object'虽然能生效,但可读性差,且新增分支多余写了一次json_column - 'json_object'操作,键不存在时删除不存在的键不会改变原对象,属于冗余代码。
修复方案
- 先清理历史错误数据,把之前误存为对象类型的
json_object值转为数组类型:
-- 替换为你的实际表名 UPDATE your_table SET json_column = jsonb_set( json_column, '{json_object}', jsonb_build_array(json_column->'json_object') ) WHERE json_column IS NOT NULL AND json_column ? 'json_object' AND jsonb_typeof(json_column->'json_object') = 'object';
- 使用修正后的更新SQL,核心改动是新增
json_object时初始化为数组类型,同时简化键存在判断逻辑:
-- 替换为你的实际表名 UPDATE your_table SET json_column = ( CASE -- json_object键不存在时,初始化为数组,存入第一个元素 WHEN NOT json_column ? 'json_object' THEN json_column || jsonb_build_object( 'json_object', jsonb_build_array(jsonb_build_object('value', 3)) ) -- 键存在时,遍历数组内所有元素追加键值对 ELSE jsonb_set( json_column, '{json_object}', ( SELECT jsonb_agg(elem || '{"value": 3}') FROM jsonb_array_elements(json_column->'json_object') AS elem ) ) END ) WHERE json_column IS NOT NULL;
注:如果你的需求是给
json_object数组追加新元素,而非给数组内已有所有元素添加value键,可以把else分支的子查询替换为json_column->'json_object' || jsonb_build_object('value',3),直接用数组拼接操作实现追加即可。
内容的提问来源于stack exchange,提问作者RuddaTriduba
相关产品推荐
相关产品推荐

