PostgreSQL中JSON列更新失败求助:修正指定JSON字段值
修复PostgreSQL JSONB字段更新失败的问题
你的JSONB更新语句失败是因为jsonb_set函数的参数使用错误,下面我帮你拆解问题并给出正确的解决方案:
问题分析
原SQL语句中,你错误地给jsonb_set传递了多余的参数,不符合该函数的标准签名:
jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean DEFAULT true)
你把要更新的子路径'{ada}'和新对象当成了独立参数,导致函数无法正确解析要更新的位置和值。
正确的更新语句
根据你的输入和期望输出,我们只需要修改ada对象下的adapartialcurrentperiod字段值,正确的SQL如下:
UPDATE data_file SET json_data = jsonb_set( json_data::jsonb, '{tables, li_daily_sales_ll, ada, adapartialcurrentperiod}'::text[], '202001'::jsonb, true ) WHERE data_file_id = 475;
关键说明:
- 路径参数
'{tables, li_daily_sales_ll, ada, adapartialcurrentperiod}'精确定位到要修改的字段 - 新值直接传入
'202001'::jsonb,保持和原字段一致的数字类型 - 最后一个
true参数表示如果路径不存在则自动创建(这里路径肯定存在,也可以省略)
另一种可选写法(更新整个ada对象)
如果你需要替换整个ada对象(比如同时修改多个字段),可以这样写:
UPDATE data_file SET json_data = jsonb_set( json_data::jsonb, '{tables, li_daily_sales_ll, ada}'::text[], jsonb_build_object( 'adatype', 'Partial', 'adatargettablename', 'xxxxxxx.xxxxxxxxxx', 'adaprimarykeycols', null, 'adafilter', null, 'adahistorypartitioncols', 'xxxxxxx', 'adapartialcurrentperiod', 202001 ), true ) WHERE data_file_id = 475;
这种写法适合需要批量修改ada下多个字段的场景,但如果只改单个字段,第一种写法更高效。
内容的提问来源于stack exchange,提问作者user9318576
相关产品推荐
相关产品推荐

