首批通过分布式安全可靠测评,为关键业务系统打造
JSON_EXISTS
更新时间:2026-03-23 14:24:08
描述
JSON_EXISTS() 函数在 SQL 语句中作为 SQL 条件,来检验指定路径下的 JSON 数据是否存在,或者满足某些条件,可以理解为针对 JSON 数据起到过滤条件作用。如果 JSON 值存在,此条件返回 TRUE,如果 JSON 值不存在,则返回 FALSE。
语法
JSON_EXISTS(
expr [FORMAT JSON],
json_path_literal
[PASSING expr AS identifier]
[ERROR|TRUE|FALSE ON ERROR]
[ERROR|TRUE|FALSE ON EMPTY]);
语法说明
JSON_EXISTS() 函数语法说明如下:
FORMAT JSON子句:可选项,当expr的数据类型是BLOB时,需要使用该子句。json_path_literal:必选参数,指定查询的路径,这里可以使用带有过滤条件的json_path语句ERROR子句:ERROR ON ERROR输入expr不是格式正确的 JSON 数据时返回相应的错误。TRUE ON ERROR输入expr不是格式正确的 JSON 数据时返回TRUE。FALSE ON ERROR输入expr不是格式正确的 JSON 数据时返回FALSE,为默认选项。
EMPTY子句:只要不存在为TRUE的结果,即返回FALSE。PASSING子句:将外部的 SQL 变量传递给json_path,用于过滤表达式中 Path 指定路径下的值和该 SQL 变量进行比较。
示例
# 使用默认参数,用于选取符合条件的 JSON 值
CREATE TABLE t (name VARCHAR2(100));
INSERT INTO t VALUES ('[{first:"John"}, {middle:"Mark"}, {last:"Smith"}]');
INSERT INTO t VALUES ('[{first:"Mary"}, {last:"Jones"}]');
INSERT INTO t VALUES ('[{first:"Jeff"}, {last:"Williams"}]');
INSERT INTO t VALUES ('[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]');
INSERT INTO t VALUES (NULL);
INSERT INTO t VALUES ('This is not well-formed JSON data');
obclient> SELECT name FROM t WHERE JSON_EXISTS(name, '$[0].first');
+---------------------------------------------------+
| NAME |
+---------------------------------------------------+
| [{first:"John"}, {middle:"Mark"}, {last:"Smith"}] |
| [{first:"Mary"}, {last:"Jones"}] |
| [{first:"Jeff"}, {last:"Williams"}] |
| [{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}] |
+---------------------------------------------------+
4 rows in set
# 当出现不匹配时,或者 expr 不是合法的JSON数据时,JSON_EXIST 返回 false
obclient> SELECT name FROM t WHERE JSON_EXISTS(name, '$[1].middle');
+---------------------------------------------------+
| NAME |
+---------------------------------------------------+
| [{first:"John"}, {middle:"Mark"}, {last:"Smith"}] |
| [{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}] |
+---------------------------------------------------+
2 rows in set
# 将 PASSING 子句传递给 json-path 参数
obclient> SELECT name FROM t WHERE JSON_EXISTS(name, '$[1]?(@.middle == $var1)' PASSING 'Anne' as "var1");
+---------------------------------------------------+
| NAME |
+---------------------------------------------------+
| [{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}] |
+---------------------------------------------------+
1 row in set