19 SQL/JSON条件JSON_EXISTS
SQL/JSON条件json_exists
は、JSONデータ内に特定の値が存在するかどうかをチェックします。対象となるデータが1つ以上のJSON値と一致する場合はtrueを返します。一致するJSON値がない場合は、falseが戻されます。
条件json_exists
では、SQL/JSONパス式を行フィルタとして使用して、JSON文書の内容に基づいて行を選択できます。json_exists
は、SELECT
文のCASE
式またはWHERE
句で使用できます。
初期化パラメータcompatible
の値が23
以上の場合は、問合せのSELECT
部分でjson_exists
を使用して、ブール結果を明示的なSQL BOOLEAN
値として取得することもできます。たとえば、この問合せでは、フィールドa
が存在することを示す値TRUE
が返されます:
SELECT json_exists('{a : null}', '$.a') FROM DUAL;
エラー・ハンドラERROR ON ERROR
、FALSE ON ERROR
およびTRUE ON ERROR
が適用されます。デフォルトはFALSE ON ERROR
です。このハンドラが有効になるのはエラーが発生したときですが、通常、エラーが発生するのは、特定のJSONデータが(緩慢な構文を使用した)整形式でない場合です。条件is json
およびis not json
の事例とは異なり、条件json_exists
では、検査するデータが整形式のJSONデータであることを予期しています。
json_exists
の2番目の引数はSQL/JSONパス式であり、オプションでPASSING
句とオプションのエラー句が付加されます。
json_exists
の場合、パス式配列ステップでは、索引と範囲の順序、配列索引の複数出現、および範囲の重複による指定された位置の重複は効果を持ちません。考慮されるのは、指定された位置のセットであり、指定された順序、回数を含む指定方法ではありません。チェックされるのは、少なくとも1つの指定された位置に一致が存在することです。
json_exists
で使用されるSQL/JSONパス式のオプションのフィルタ式では、SQL/JSON変数を参照できます。これらの変数の値は、PASSING
句にバインドすることでSQLによって渡されます。このような変数でサポートされているSQLデータ型は、VARCHAR2
、NUMBER
、BINARY_DOUBLE
、DATE
、TIMESTAMP
およびTIMESTAMP WITH TIME ZONE
です。
ヒント:
頻繁に使用する問合せの場合には、PASSING
句を使用してSQLバインド変数を定義します。これらは、パス式でSQL/JSON変数として使用されます。これにより、(変数)値の変更時に問合せの再コンパイルを回避することで、パフォーマンスが向上する可能性があります。
たとえば、この問合せは、バインド変数v1
の値をSQL/JSON変数$v1
として渡します。
SELECT po.data FROM j_purchaseorder po
WHERE json_exists(po.data,
'$.LineItems.Part?(@.UPCCode == $v1)'
PASSING '85391628927' AS "v1");
関連項目:
json_exists
およびPASSING
句の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
- JSON_EXISTSでのフィルタの使用
SQL/JSON条件json_exists
は、照合データが格納された文書を選択するために、1つ以上のフィルタ式を持つパス式と一緒に使用できます。フィルタを使用することで、様々な条件を満たす特定のフィールドを持つ文書があるかどうかをテストできます。 - JSON_TABLEとしてのJSON_EXISTS
SQL/JSON条件json_exists
は、SQL/JSONファンクションjson_table
の特別な事例であるとみなすことができます。
関連トピック
親トピック: JSONデータの問合せ