説明
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_pathLiteral:必須パラメータ。クエリのパスを指定します。ここでは、フィルタ条件付きの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データでない場合、JSONExistsはfalseを返します
obclient> SELECT name FROM t WHERE JSONExists(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 JSONExists(name, '$[1]?(@.middle == $var1)' PASSING 'Anne' as "var1");
+---------------------------------------------------+
| NAME |
+---------------------------------------------------+
| [{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}] |
+---------------------------------------------------+
1 row in set