JSONTABLE
関数はJsonPathを使用して表形式の出力を生成します。これは暗黙的にネストされたテーブルであり、直前のFROM
Clause項目と相関があるかもしれません。
Usage
JSONTABLE(value, path [, nullLeafOnMissing] COLUMNS <COLUMN>, ... ) AS name
COLUMN := name (FOR ORDINALITY | (datatype [PATH string]))
Parameters
value
は有効なJSONドキュメントを含むCLOBです;nullLeafOnMissing
がFALSE
(DEFAULT) の場合、欠落しているリーフを評価するパスは例外をスローします。nullLeafOnMissing
が TRUE の場合、NULL 値が返されます;パス文字列は有効な
JsonPath
でなければなりません。配列値が返された場合、NULLでない各要素が行の生成に使用されます。そうでない場合は、単一の行を作成するために単一の非NULL項目が使用されます;FOR ORDINALITY
カラムはintegerとして型付けされ、その値として1ベースのアイテム番号を返します;各非順位の列は、型を指定し、オプションで
PATH
を指定します;PATH
が指定されない場合、パスはカラム名から生成されます:@['name'] -
は名前に一致するオブジェクトキー値を探します。PATH
が指定された場合、@
で始まらなければなりません。これは、パスが現在の行コンテキスト項目からの相対パスで処理されることを意味します。
Syntax Rules
カラム名に重複があってはなりません;
配列タイプは現在サポートされていません。
Examples
パッシングを使用すると、1行[1]を返します:
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 JSONTABLE(
'[{"firstName": "John", "lastName": "Wayne", "children": []}, {"firstName": "John", "lastName": "Adams", "children":["Sue","Bob"]}]'
,
'$.*'
COLUMNS familyName string path
'@.lastName'
, children integer path
'@.children.length()'
) x
Differences from XMLTABLE
JSONから表形式の結果へのOF処理は、XMLTABLEとJSONTOXMLを使用することで以前から推奨されていました。ほとんどのタスクでは、JSONTABLE
、よりシンプルな構文が用意されています。しかし、考慮すべきいくつかの違いがあります:
JSONTABLE
XMLTABLEメモリのオーバーヘッドを減らすために、ストリーミング処理をサポートしています;
JsonPathはXQueryほど強力ではありません。XQuery/XPathで利用できる関数や操作の中には、JsonPathでは利用できないものがたくさんあります;
JsonPathでは、カラムパスで親を参照することができません。ルートや親階層の一部(XPathでは...)を参照する機能はありません。
JSONTABLE is available since v4.0.8