VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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)