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
相关产品推荐
相关产品推荐

