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 ERRORFALSE 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データ型は、VARCHAR2NUMBERBINARY_DOUBLEDATETIMESTAMPおよび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言語リファレンス』を参照してください