JSONB_PATH_EXISTS
功能描述
JSONB_PATH_EXISTS函数用于对JSONB类型的数据进行检查,检查给定的JSON路径中是否存在指定的JSON值。该函数的返回值是Boolean类型的值,如存在则返回‘t’,如不存在则返回‘f’。
注意事项
该功能仅在数据库兼容模式为PG时能够使用(即创建DB时DBCOMPATIBILITY='PG'),在其他数据库兼容模式下不能使用该特性。
如果任意一个入参为NULL,则该函数将返回NULL。
仅Vastbase G100 V2.2 Build 10(Patch No.12)及以后补丁版本支持此功能。
语法格式
jsonb_path_exists ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean
参数说明
target
必需的。待检查的指定JSONB值。
path
必需的。被检查的目标JSON路径。
vars
可选的。JSON路径中要用到的变量值。
如果指定了vars参数,则它必须是一个JSON对象。它提供了一个包含命名的变量的对象,要替换到jsonpath表达式中。
silent
可选的。报错标识,Boolean类型。
如果指定了silent参数并且值为true,那么函数将抑制与
@?
和@@
操作符相同的错误。@?
和@@
操作符会抑制以下错误:缺乏对象字段或数组元素、意外的JSON项类型和数字错误。在搜索不同结构的JSON文档集合时,这种抑制功能可能会有帮助。
示例
前置步骤:创建并切换至兼容模式为PG的数据库。
CREATE DATABASE db_pg DBCOMPATIBILITY 'PG';
\c db_pg
示例1: 执行JSONB值检查,仅指定target和path。
SELECT jsonb_path_exists('[1, 2, 3]', '$[*] ? (@ > 1)');
返回结果如下:
jsonb_path_exists
-------------------
t
(1 row)
示例2: 执行JSONB值检查,指定可选参数vars和silent。
JSON路径中存在target值:
select jsonb_path_exists('{"a":[1,2,3,4,5]}', '$.a[3] ? (@ >= $min && @ <= $max)','{"min":2,"max":4}');
返回结果如下:
jsonb_path_exists ------------------- t (1 row)
JSON路径中不存在target值:
select JSONB_PATH_EXISTS('{"a":[1,2,3,4,5]}', '$.a[3] ? (@ > $min && @ < $max)', '{"min":2, "max":4}',true);
返回结果如下:
jsonb_path_exists ------------------- f (1 row)
示例3: 执行JSONB值检查,指定其中target或path参数为NULL。
target为空:
select jsonb_path_exists(null, '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}',true);
返回结果如下:
jsonb_path_exists ------------------- (1 row)
path为空:
select jsonb_path_exists('{"a":[1,2,3,4,5]}',null,'{}',true);
返回结果如下:
jsonb_path_exists ------------------- (1 row)
示例4: jsonb_path_exists函数与表结合使用。
1、创建包含jsonb类型字段的测试表并插入数据。
create table tab_1157240(a1 jsonb,id int,a2 text,a3 date);
insert into tab_1157240 values('{"a":[1,2,3,4,5]}',1,'{"a":[1,2,3,4,5]}','2023-12-13');
insert into tab_1157240 values('{"a":[1,2,3]}',1,'{"a":[1,2,3,4]}','2023-09-23');
2、调用jsonb_path_exists函数,指定待检查的目标数据来自测试表的字段a1。
select jsonb_path_exists(a1, '$.a[3]', '{"min":2,"max":4}',true) from tab_1157240;
返回结果如下:
jsonb_path_exists
-------------------
t
f
(2 rows)