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;
親トピック: JSONデータの索引