JSONB_SET
功能描述
JSONB_SET函数替换指定的路径上的值或者在指定的路径上插入值。函数返回值为JSONB类型。
语法格式
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) → JSONB
参数说明
target
要插入新值的JSONB值。
path
一个文本数组,指示了新值插入的位置。
如果path中的最后一个路径项是一个对象键,例如
{0, a}
表示在下标是0的位置插入或更新a属性。如果path中的最后一个路径项是范围内的数组索引,则正值表示从左边开始计数,负值表示从右边开始计数。-1表示最右边的元素,以此类推。
如果path中的最后一个路径项是超出范围的数组索引,且create_missing标识为true,则该项为负时把新值加在数组的开头,该项为正时把新值加在数组的末尾。
path参数中除最后一项之外的所有项都必须存在于target中。如果create_missing为false,jsonb_set的path参数的所有项都必须存在。如果这些条件不满足,函数将返回给定的原target。
new_value
要插入的新值。
create_missing
可选参数。它指示如果指定的路径不存在时是否添加指定的新值new_value。默认值为 true。
示例
示例1: 使用JSONB_SET函数插入或更新target内容,path最后一项为对象键。
1、对象键“fullName”已存在,将值从“李四”更新为“张三”。
select jsonb_set('{"CHINESE": {"Id":"abcd","fullName": "李四"}}','{CHINESE,fullName}','"张三"');
返回结果如下:
jsonb_set
-------------------------------------------------
{"CHINESE": {"Id": "abcd", "fullName": "张三"}}
(1 row)
2、对象键“gender”不存在,插入该对象键以及新值。
select jsonb_set('{"CHINESE": {"Id":"abcd","fullName": "李四"}}','{CHINESE,gender}','"男"');
返回结果如下:
jsonb_set
-----------------------------------------------------------------
{"CHINESE": {"Id": "abcd", "gender": "男", "fullName": "李四"}}
(1 row)
3、对象键gender不存在,create_missing为false。
select jsonb_set('{"CHINESE": {"Id":"abcd","fullName": "李四"}}','{CHINESE,gender}','"男"',false);
返回结果如下,未插入新值:
jsonb_set
-------------------------------------------------
{"CHINESE": {"Id": "abcd", "fullName": "李四"}}
(1 row)
示例2: 使用JSONB_SET函数插入或更新target内容,path最后一项为数组索引。
1、path指定的数组索引是范围内的正数,且create_missing为true。
select jsonb_set('[{"f1":1,"f2":null},{"2":9},{"null":90},{"3":87}]', '{1}', '[2,3,4]');
直接在指定位置插入新值,返回结果如下:
jsonb_set
-------------------------------------------------------------
[{"f1": 1, "f2": null}, [2, 3, 4], {"null": 90}, {"3": 87}]
(1 row)
2、path指定的数组索引是范围内的负数,且create_missing为true。
select jsonb_set('[{"f1":1,"f2":null},{"2":9},{"null":90},{"3":87}]', '{-2}', '[2,3,4]');
直接在指定位置插入新值,返回结果如下:
jsonb_set
---------------------------------------------------------
[{"f1": 1, "f2": null}, {"2": 9}, [2, 3, 4], {"3": 87}]
(1 row)
3、path指定的数组索引是不在范围内的正数,且create_missing为true。
select jsonb_set('[{"f1":1,"f2":null},{"2":9},{"null":90},{"3":87}]', '{6}', '[2,3,4]');
新值被插入到了数组的最末尾,返回结果如下:
jsonb_set
-----------------------------------------------------------------------
[{"f1": 1, "f2": null}, {"2": 9}, {"null": 90}, {"3": 87}, [2, 3, 4]]
(1 row)
4、path指定的数组索引是不在范围内的负数,且create_missing为true。
select jsonb_set('[{"f1":1,"f2":null},{"2":9},{"null":90},{"3":87}]', '{-5}', '[2,3,4]');
新值被插入到了数组的开头,返回结果如下:
jsonb_set
-----------------------------------------------------------------------
[[2, 3, 4], {"f1": 1, "f2": null}, {"2": 9}, {"null": 90}, {"3": 87}]
(1 row)