VastbaseG100

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

Menu

JSONB_PATH_QUERY_FIRST

功能描述

JSONB_PATH_QUERY_FIRST函数在一个给定的JSON中根据指定的路径获取值,并返回第一个匹配的值,如果没有结果则返回NULL。

注意事项

  • 该功能仅在数据库兼容模式为PostgreSQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='PG')。
  • 如果任意一个参数是NULL,JSONB_PATH_QUERY_FIRST函数将返回NULL。
  • 该函数支持的Vastbase版本:
    • V2.2 Build 15 (Patch No.2)及以后补丁版本。
    • V2.2 Build 16及以后版本。

语法格式

JSONB_PATH_QUERY_FIRST(target JSONB, path JSONPATH[, vars JSONB[, silent BOOLEAN]]) -> JSONB

参数说明

  • target

    必选参数,要检查的JSONB值。

  • path

    必选参数,要检查的JSON路径,它是JSONPATH类型的。

  • vars

    可选参数,路径中要用到的变量值。

  • silent

    可选参数,如果提供了此参数,并且为true,该函数会像@?@@操作符一样抑制相同的错误。

示例

示例1: 直接调用JSONB_PATH_QUERY_FIRST函数。

-- JSON数组 [2] 中找到第一个元素(索引为0的元素)并加上3
select * from jsonb_path_query_first('[2]', '$[0] + 3') ;

--从JSON数组 [32] 中找到第一个元素(索引为0的元素)并取模10
select * from jsonb_path_query_first('[32]', '$[0] % 10');

返回结果如下:

jsonb_path_query_first
----------------------
5
(1 row)

jsonb_path_query_first
----------------------
2
(1 row)

示例2: JSONB_PATH_QUERY_FIRST函数与表结合使用。

1、创建2个测试表并插入数据。

create table tab_1189683(id int unique,a1 jsonb unique,a2 jsonb default jsonb_path_query_first('{"name":"test"}','$.name'),a3 jsonb check(a3=jsonb_path_query_first('{"name":"test"}','$.name.y')));
create unlogged table tt_1189683(id int unique,a1 jsonb unique);
insert into tt_1189683 values(1,'{"name":"test"}');
insert into tt_1189683 values(2,'{"name":"zyx"}');
insert into tt_1189683 values(3,'{"name":"gwh"}');

2、insert触发约束。

在如下插入语句中,由于a2字段的默认值是通过函数jsonb_path_query_first设置的,并且该函数在该段代码中查询的是"name":"test"对应的name.y值,所以如下两条操作都会使a2字段的值变为"test"

insert into tab_1189683 values(1,'{"a":[1,2,3,4,5],"b":{"x":1.23,"y":3.45},"name":"test","x":4.76}',default);
insert into tab_1189683 values(3,'{"a":[1,2,3,4,5],"b":{"x":1.23,"y":3},"name":"test","x":4.76}',default);

3、查询表数据。

select * from tab_1189683;

返回结果为:

id   |                              a1                                   |   a2   |     a3
-----+-------------------------------------------------------------------+--------+----------
  1  | {"a":[1,2,3,4,5],"b":{"x":1.23,"y":3.45},"x":4.76,"name":"test"}  |  "test"|
  3  | {"a":[1,2,3,4,5],"b":{"x":1.23,"y":3},"x":4.76,"name":"test"}     |  "test"|
(2 rows)

4、直接调用JSONB_PATH_QUERY_FIRST函数。

select jsonb_path_query_first(a1,'$.b') from tab_1189683;
select jsonb_path_query_first(a1,'$.name.y') from tab_1189683;
select jsonb_path_query_first(a1,'$.b ?(@.*>4)') from tab_1189683;
select jsonb_path_query_first(a1,'$.** ?($.x>4)') from tab_1189683;
select jsonb_path_query_first(a1,'$.**{1} ?(@.x>4)') from tab_1189683;
select jsonb_path_query_first(a1,'$.a[*] ? (@ >= $min && @ <= $max)','{"min":2, "max":4}') from tab_1189683;
select jsonb_path_query_first(a1,'$.a[1,2] ? (@ >= $min && @ <= $max)','{"min":2, "max":4}') from tab_1189683;

返回结果为:

jsonb_path_query_first
----------------------
{"x":1.23,"y":3.45}
{"x":1.23,"y":3}
(2 rows)

jsonb_path_query_first
----------------------


(2 rows)


jsonb_path_query_first
----------------------


(2 rows)

                jsonb_path_query_first
------------------------------------------------------------------
 {"a":[1,2,3,4,5],"b":{"x":1.23,"y":3.45},"x":4.76,"name":"test"}
 {"a":[1,2,3,4,5],"b":{"x":1.23,"y":3},"x":4.76,"name":"test"}
(2 rows)

jsonb_path_query_first
----------------------


(2 rows)

jsonb_path_query_first
----------------------
2
2
(2 rows)

jsonb_path_query_first
----------------------
2
2
(2 rows)

5、更新数据并查询结果。

update tab_1189683 set a2=jsonb_path_query_first(a1,'$.name');
select * from tab_1189683;

返回结果为:

id   |                              a1                                   |   a2   |     a3
-----+-------------------------------------------------------------------+--------+----------
  1  | {"a":[1,2,3,4,5],"b":{"x":1.23,"y":3.45},"x":4.76,"name":"test"}  |  "test"|
  3  | {"a":[1,2,3,4,5],"b":{"x":1.23,"y":3},"x":4.76,"name":"test"}     |  "test"|
(2 rows)