21.1 JSON_TABLEとしてのJSON_QUERY
SQL/JSONファンクションjson_query
は、関数json_table
の特別な事例であるとみなすことができます。
例21-2に、この対応を示します。2つのSELECT
文で得られる結果は同じになります。
この対応は、おそらくjson_query
についてより深く理解する手助けとなるのみでなく、どちらの関数を使用しても同じ結果が得られることを意味しているため、実質的に重要な意味を持ちます。
特に、json_query
を複数回使用する場合、またはこれをjson_exists
またはjson_value
(これらもjson_table
を使用して表すことができます)と組み合せて使用して同じデータにアクセスする場合、json_table
を1回呼び出す方が、データが解析されるのが1回のみであるという利点があります。
このため、オプティマイザがjson_exists
、json_value
およびjson_query
の複数の呼出し(任意の組合せ)を、より少ないjson_table
の呼出しに自動的にリライトすることがよく起こります。
ノート:
SQLヒントNO_JSON_TABLE_TRANSFORM
を使用すると、json_exists
、json_value
およびjson_query
の複数の呼出し(任意の組合せ)が、より少ない数の、json_table
の呼出しにリライトされなくなります。
例21-2 JSON_TABLEを使用して表されたJSON_QUERY
キーワードFORMAT JSON
は、data_type
がJSON
型ではない場合にのみ使用します。(キーワードFORMAT JSON
はJSON
型には使用できません。)
SELECT json_query(column, json_path
RETURNING data_type array_wrapper
error_handler ON ERROR)
FROM table;
SELECT jt.column_alias
FROM table,
json_table(column, '$' error_handler ON ERROR
COLUMNS ("COLUMN_ALIAS" data_type FORMAT JSON array_wrapper
PATH json_path)) AS "JT";