説明
JSON EXISTS() 関数は、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に渡し、フィルター式内のパスで指定されたパス下の値とこの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 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