You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何仅修改JSON键名(ABC改abc)且保留值不变?

仅修改PostgreSQL JSONB字段的键名中的指定字符串,保留值不变

原始JSONB数据(存储在user_portal.pipeline_config表的auth_config字段):

{
  "Table": "admin.lookup",
  "New ABC Table": "SQL_ABC_Test_DP",
  "Package Bucket": "",
  "Storage Bucket": "",
  "ABC Table selector": "false",
  "Existing ABC Table": "",
  "Migrated Table Name": "SQL_ABC_Test_DP"
}

执行以下更新语句时,会同时修改键名和值中的ABC为abc:

update user_portal.pipeline_config set auth_config = replace(auth_config::text, 'ABC', 'abc')::jsonb

得到的非预期结果:

{
  "Table": "admin.lookup",
  "New abc Table": "SQL_abc_Test_DP",
  "Package Bucket": "",
  "Storage Bucket": "",
  "abc Table selector": "false",
  "Existing abc Table": "",
  "Migrated Table Name": "SQL_abc_Test_DP"
}

期望结果(仅修改键名中的ABC,值保持不变):

{
  "Table": "admin.lookup",
  "New abc Table": "SQL_ABC_Test_DP",
  "Package Bucket": "",
  "Storage Bucket": "",
  "abc Table selector": "false",
  "Existing abc Table": "",
  "Migrated Table Name": "SQL_ABC_Test_DP"
}

解决方案

使用jsonb_each拆解JSONB的键值对,对键名单独做字符串替换,再通过jsonb_object_agg重新组合成新的JSONB对象:

UPDATE user_portal.pipeline_config
SET auth_config = (
  SELECT jsonb_object_agg(
    replace(key::text, 'ABC', 'abc'),  -- 仅修改键名中的ABC为abc
    value                              -- 保留原始值不变
  )
  FROM jsonb_each(auth_config)
);

说明

  • jsonb_each(auth_config):将JSONB字段拆分为多行的键值对记录
  • replace(key::text, 'ABC', 'abc'):仅对键名执行字符串替换
  • jsonb_object_agg(...):将处理后的键值对重新聚合为JSONB对象

内容的提问来源于stack exchange,提问作者Sushmita Lokhande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:25:38