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)