JSONTABLE関数はJsonPathを使用して表形式の出力を生成します。これは暗黙的にネストされたテーブルであり、直前のFROM Clause項目と相関があるかもしれません。

Usage

JSONTABLE(value, path [, nullLeafOnMissing] COLUMNS <COLUMN>, ... ) AS name
COLUMN := name (FOR ORDINALITY | (datatype [PATH string]))

Parameters

  • valueは有効なJSONドキュメントを含むCLOBです;

  • nullLeafOnMissingFALSE(DEFAULT) の場合、欠落しているリーフを評価するパスは例外をスローします。nullLeafOnMissingが TRUE の場合、NULL 値が返されます;

  • パス文字列は有効なJsonPathでなければなりません。配列値が返された場合、NULLでない各要素が行の生成に使用されます。そうでない場合は、単一の行を作成するために単一の非NULL項目が使用されます;

  • FOR ORDINALITYカラムはintegerとして型付けされ、その値として1ベースのアイテム番号を返します;

  • 各非順位の列は、型を指定し、オプションでPATHを指定します;

  • PATHが指定されない場合、パスはカラム名から生成されます: @['name'] -は名前に一致するオブジェクトキー値を探します。PATHが指定された場合、@で始まらなければなりません。これは、パスが現在の行コンテキスト項目からの相対パスで処理されることを意味します。

Syntax Rules

  • カラム名に重複があってはなりません;

  • 配列タイプは現在サポートされていません。

Examples

  1. パッシングを使用すると、1行[1]を返します:

SELECT * FROM JSONTABLE('{"a": {"id":1}}}', '$.a' COLUMNS id integer) x
  1. ネストされたテーブルとして:

SELECT x.* FROM t, JSONTABLE(t.doc, '$.x.y' COLUMNS first string, second FOR ORDINALITY) x
  1. もっと複雑な経路で:

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処理は、XMLTABLEJSONTOXMLを使用することで以前から推奨されていました。ほとんどのタスクでは、JSONTABLE、よりシンプルな構文が用意されています。しかし、考慮すべきいくつかの違いがあります:

  • JSONTABLEXMLTABLEメモリのオーバーヘッドを減らすために、ストリーミング処理をサポートしています;

  • JsonPathはXQueryほど強力ではありません。XQuery/XPathで利用できる関数や操作の中には、JsonPathでは利用できないものがたくさんあります;

  • JsonPathでは、カラムパスで親を参照することができません。ルートや親階層の一部(XPathでは...)を参照する機能はありません。

JSONTABLE is available since v4.0.8