9.4 版本中 JSONB 数据类型可以通过函数和操作符获取元素值,但不能修改其元素值,很多有 JSON 需求场景的朋友都非常期待这一功能,好在 9.5 版支持 JSONB 元素修改,可以说 JSONB 数据类型在功能上获得了较大提升。 JSONB 元素修改有两种方法,详见以下。
通过 || 操作符
通过 jsonb || jsonb (concatenate / overwrite) 操作符可以覆盖元素值,例如。
样例 jsonb 数据
1 |
postgres=# select '{"name":"francs","age":"31"}'::jsonb; |
修改 age 元素值
1 |
postgres=# select '{"name":"francs","age":"31"}'::jsonb || '{"age":"32"}'::jsonb; |
通过 jsonb_set() 函数
9.5 版本支持 jsonb_set() 函数修改元素值。
jsonb_set 函数语法
1 |
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) |
jsonb_set 函数使用
修改 age 元素值为 32
1 |
postgres=# select jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{age}','"32"'::jsonb,false); |
仔细看下面这个操作的区别
1 |
postgres=# SELECT '{"name": "Jane", "contact": {"fax": "0000","phone": "01234 567890", "mobile": "07890 123456"}}'::jsonb || '{"contact": {"fax": "01987 654321"}}'::jsonb; |
备注: 如果是嵌套元素,|| 操作会从上层替换整个嵌套元素值。
Jsonb: 添加元素
|| 操作符同时也支持连接 jsonb 数据类型 ,例如,连接 sex 元素值
1 |
postgres=# select '{"name":"francs","age":"31"}'::jsonb || '{"sex":"male"}'::jsonb; |
Jsonb: 删除元素
删除元素值也有两种方法,一种是通过操作符 – ,另一种通过指定路径删除。
通过操作符删除元素
1 |
postgres=# SELECT '{"name": "James", "email": "james@localhost"}'::jsonb - 'email'; |
指定路径删除元素
也可以指定路径删除元素,适合 jsonb 数据有嵌套元素并且内容较多的场景,语法如下:
1 |
jsonb #- text[] / int (remove key / array element in path) |
示例如下:
1 |
postgres=# SELECT '{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb #- '{contact,fax}'::text[]; |
jsonb_pretty 函数
jsonb_pretty 函数用来格式化 jsonb 数据类型输出,如下。
1 |
postgres=# SELECT jsonb_pretty('{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb); |
参考
- PostgreSQL9.3Beta1:JSON 功能增强
- PostgreSQL 9.4: 新增 JSONB 数据类型
- PostgreSQL9.4: JSONB 性能测试
- JSON Functions and Operators
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/239629.html