Postgresql中如何替换jsonb对象指定键对应值的特定文本
PostgreSQL 仅替换jsonb指定键对应值的文本实现方案
核心逻辑:不要将整个jsonb转字符串全局替换,而是单独提取目标键的值完成替换后写回原jsonb对象,避免影响其他键的值。
方案1:全版本兼容(支持PostgreSQL 9.5及以上)
使用内置jsonb_set函数实现,示例代码如下:
UPDATE content SET dynamic_fields = jsonb_set( dynamic_fields, '{key2}', -- 指定要修改的键路径,顶层键直接写入数组即可 to_jsonb(replace(dynamic_fields->>'key2', 'text1', 'text2')), -- 替换目标值后转为jsonb格式 false -- 目标键不存在时不执行新增操作,有新增需求可改为true ) WHERE id = 0; -- 按需添加过滤条件,避免全表误更新
方案2:简洁写法(支持PostgreSQL 14及以上)
可以用jsonb下标语法简化操作:
UPDATE content SET dynamic_fields['key2'] = to_jsonb(replace(dynamic_fields->>'key2', 'text1', 'text2')) WHERE id = 0;
注意事项
- 若目标键为嵌套结构,例如要修改
a.b.key2,只需将jsonb_set的路径参数改为'{a,b,key2}'即可 - 可按需添加WHERE条件缩小更新范围:过滤存在目标键的行可加
dynamic_fields ? 'key2',过滤目标键值为字符串的行可加jsonb_typeof(dynamic_fields->'key2') = 'string',进一步降低误更新风险 - 如果需要批量处理全表符合条件的行,去掉
id=0的过滤条件即可
内容的提问来源于stack exchange,提问作者Stefano De Rosso
相关产品推荐
相关产品推荐

