3.6.8.6. JSONTABLE
JSONTABLE 関数は JsonPath を使用して表形式出力を生成します。JSONTABLE 機能は暗黙的にネストされたテーブルで、FROM 句内で使用できます。
用途
JSONTABLE(value, path [, nullLeafOnMissing] COLUMNS <COLUMN>, ... ) AS name
JSONTABLE(value, path [, nullLeafOnMissing] COLUMNS <COLUMN>, ... ) AS name
COLUMN := name (FOR ORDINALITY | (datatype [PATH string]))
COLUMN := name (FOR ORDINALITY | (datatype [PATH string]))
JsonPathも参照してください。
パラメーター
- value
- 有効な JSON ドキュメントを含む clob。
- nullLeafOnMissing
false(デフォルト)の場合は、欠落しているリーフに評価されるパスにより例外が発生します。nullLeafOnMissing が true の場合、null 値が返されます。
- PATH
- 文字列は有効な JsonPath である必要があります。配列の値が返されると、行の生成に null 以外の各要素が使用されます。そうでないと、null 以外の項目 1 つを使用して行を作成します。
- FOR ORDINALITY
整数として入力された列。1 ベースのアイテム番号をその値として返します。
- 各非理論の列は型を指定し、オプションで PATH を指定します。
- PATH が指定されていない場合、パスは @['name'] コラム名から生成されます。PATH が指定されている場合は、@ で始まる必要があります。これは、パスが現在の行コンテキスト項目の相対パスで処理されることを意味します。
構文ルール
- 列名に重複を含めることはできません。
- JSONTABLE 関数で配列タイプを使用することはできません。
JSON 表の例
渡すと 1 行を返します [1]。
select * from jsontable('{"a": {"id":1}}}', '$.a' COLUMNS id integer) x
select * from jsontable('{"a": {"id":1}}}', '$.a' COLUMNS id integer) x
ネストされたテーブルとして以下を実行します。
select x.* from t, jsontable(t.doc, '$.x.y' COLUMNS first string, second FOR ORDINALITY) x
select x.* from t, jsontable(t.doc, '$.x.y' COLUMNS first string, second FOR ORDINALITY) x
より複雑なパス:
select x.* from jsontable('[{"firstName": "John", "lastName": "Wayne", "children": []}, {"firstName": "John", "lastName": "Adams", "children":["Sue","Bob"]}]', '$.*' COLUMNS familyName string path '@.lastName', children integer path '@.children.length()' ) x
select x.* from jsontable('[{"firstName": "John", "lastName": "Wayne", "children": []}, {"firstName": "John", "lastName": "Adams", "children":["Sue","Bob"]}]', '$.*' COLUMNS familyName string path '@.lastName', children integer path '@.children.length()' ) x
XMLTABLE との相違点
JSON から表への結果の処理は、以前は JSONTOXML で XMLTABLE を使用することで推奨されていました。ほとんどのタスクでは、JSONTABLE はより簡単な構文を提供します。ただし、以下のような違いがいくつかあります。
- JSONTABLE は、JSON を完全に解析します。XMLTABLE はストリーミング処理を使用して、メモリーのオーバーヘッドを減らします。
- JSONPath は、XQuery より強力なものではありません。XQuery/XPath には多くの関数および操作があり、JsonPath では使用できません。
- JSONPath では、列パスの親参照は許可されません。親階層のルートまたは任意の部分を参照する機能はありません(XPath 内の)。