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_existsjson_valueおよびjson_queryの複数の呼出し(任意の組合せ)を、より少ないjson_tableの呼出しに自動的にリライトすることがよく起こります。

ノート:

SQLヒントNO_JSON_TABLE_TRANSFORMを使用すると、json_existsjson_valueおよびjson_queryの複数の呼出し(任意の組合せ)が、より少ない数の、json_tableの呼出しにリライトされなくなります。

例21-2 JSON_TABLEを使用して表されたJSON_QUERY

キーワードFORMAT JSONは、data_typeJSON型ではない場合にのみ使用します。(キーワードFORMAT JSONJSON型には使用できません。)

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";