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操作的數據庫。