场景
当你不小心将 key
的名称写错了(人员类别:
多了一个冒号),或者想把引文改为中文(type
改为类型
)
大致思路是添加一个新的 key
,然后将旧的 key
删除
sql语句
假如 JSON 列为 extra
:
- 可以使用
extra::jsonb ->> 'type'
获取到type
的值->> 以text形式获得 JSON 对象域 '{"a":1,"b":2}'::json->>'b' 2
- 可以使用
extra::jsonb - 'type'
将type
删除- 从左操作数删除键/值对或者string 元素。键/值对基于它们的键值来匹配。 '{"a": "b"}'::jsonb - 'a'
- 可以使用
jsonb_set
来修改 json 列中的值jsonb_set(target jsonb, path text[], new_value jsonb[,create_missing boolean]) 返回target,其中由 path指定的节用 new_value替换,如果 path指定的项不存在并且 create_missing为真(默认为 true)则加上 new_value。正如面向路径的 操作符一样,出现在path中的 负整数表示从 JSON 数组的末尾开始数。 jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false) jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]') [{"f1":[2,3,4],"f2":null},2,null,3] [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]
学习了以上知识点,就可以组合使用,最终的 sql
语句如下:
sql
UPDATE table_name
SET extra = jsonb_set(extra::jsonb - 'type', '{类型}', extra::jsonb ->> 'type')
WHERE extra ->> 'type' is not null;
参考链接: