30.5 JSON_VALUE関数ベースの索引とJSON_TABLE問合せの使用

ERROR ON ERRORを指定したjson_valueを使用して作成された索引は、json_tableを含む問合せに使用できます。この場合、この索引が索引付きパスに対する制約として機能することで、JSONデータ内の項目ごとに必ず1つの(非null)スカラーJSON値のみが投影されるようになります。

この方法で索引を使用する場合は、次の各条件が満たされている必要があります。

  • 問合せのWHERE句は、json_tableによって投影される列を参照する。

  • その列のデータ型は、索引定義に使用されたデータ型と一致する。

  • その列を対象とする有効なSQL/JSONパスが、索引付けされたパス式と一致する。

そのため、例30-5の問合せでは、例30-3で作成した索引を使用しています。

ノート:

json_value式またはドット表記法を使用して作成された関数ベースの索引を、問合せでWHERE句が出現するたびに取得できるのは、この発生がSQLの比較条件(>=など)で使用されている場合のみです。特に、これは、条件IS NULLまたはIS NOT NULLで使用される存在としては選択されません。

SQL比較条件の詳細は、Oracle Database SQL言語リファレンスを参照してください。

例30-5 JSON_VALUEファンクション・ベースの索引とJSON_TABLE問合せの使用

列のSQL型NUMBER(5)が索引に使用されている型と一致するため、索引を選択できます。

SELECT jt.*
  FROM j_purchaseorder po,
       json_table(po.data, '$'
         COLUMNS po_number  NUMBER(5) PATH '$.PONumber',
                 reference  VARCHAR2(30 CHAR) PATH '$.Reference',
                 requestor  VARCHAR2(32 CHAR) PATH '$.Requestor',
                 userid     VARCHAR2(10 CHAR) PATH '$.User',
                 costcenter VARCHAR2(16 CHAR) PATH '$.CostCenter') jt
  WHERE po_number = 1600;