PostgreSQL更新JSON中的某个字段
背景需求
现在需要通过SQL的方式,批量对JSON里面的某个字段统一处理,更新成一个新值。
方法一 、使用jsonb_set函数
补充:读取JSON中的值。
select ‘{“a”:“foo”,“b”:1}’::json->‘a’; – 获得键’a’的值
select ‘{“a”:“foo”,“b”:1}’::json->>‘a’; – 以文本形式获得键’a’的值
将键’a’的值替换为3
postgres=# select jsonb_set('{"a":1,"b":2}','{a}','3'::jsonb);
jsonb_set
------------------
{"a": 3, "b": 2}
(1 row)
学习json_set函数后,接下来编写自己的案例
1. 批量操作值前一定需要先通过select选择性处理,查看是否满足
select * from biz_object
where modelcode = '829609839767532682' and objectcode = '948118654552248419';
2. 第二步:进行批量更新。
UPDATE biz_object set confjson = (jsonb_set(confjson::jsonb,'{directorytypecode}','"947998009457774691"'::jsonb)),directorytypecode = '947998009457774691'
where modelcode = '829609839767532682' and objectcode = '948118654552248419';
方法二、使用update语句也行
利用Navicat等工具
第一步:先查询出所有满足的记录,然后复制成update语句。
第二步:使用文本编辑器(notepad++)等,批量替换值。
第三步:批量执行替换后的update语句。
总结
第一种方案,会修改json的顺序,但是更通用高效。
第二种方案,先查询结果,然后拷贝成update语句,然后使用文本替换工具,批量替换后进行插入。这种方式对于成千上万的数据进行拷贝复制不友好。但小数据量还是可行。适合一些不支持JSON操作的数据库。