この例では、入れ子配列を持つ小さなJSONドキュメントを作成し、それをVantageJSONデータ型としてデータベース テーブルに挿入します。まず、TD_JSONSHREDを使用して外部配列からデータを抽出し、次に入れ子のTD_JSONSHRED呼び出しを使用して内部配列からデータを抽出します。さらに、さまざまなレベルの配列からデータを抽出する方法を示します。
create table JsonNestArrays (id integer, jsondoc JSON); insert JsonNestArrays (1,'{ "students":[ { "name":"Cameron", "age":24, "schools":[ { "sname":"Lake", "stype":"elementary" }, { "sname":"Madison", "stype":"middle" }, { "sname":"Rancho", "stype":"high" }, { "sname":"UCI", "stype":"college" } ], "job":"programmer" }, { "name":"Fred", "age":42, "schools":[ { "sname":"Sloat", "stype":"elementary" }, { "sname":"Aptos", "stype":"middle" }, { "sname":"Lowell", "stype":"high" }, { "sname":"UCB", "stype":"college" } ], "job":"manager" } ] }');
以下の単一TD_JSONSHRED呼び出しでは、"students"配列、"students"から、"schools"エントリのみを取得します。結果として得られるテーブルの各行には、各studentの"schools"配列全体が含まれています。
SELECT * FROM TD_JSONSHRED( ON (sel id, jsondoc from JsonNestArrays) USING ROWEXPR('students') COLEXPR('schools') RETURNTYPES('VARCHAR(150)') ) AS d1;
id schools -- -------------------------------------------------------------------------------------- 1 [{"sname":"Lake","stype":"elementary"},{"sname":"Madison","stype":"middle"}, {"sname":"Rancho","stype":"high"},{"sname":"UCI","stype":"college"}] 1 [{"sname":"Sloat","stype":"elementary"},{"sname":"Aptos","stype":"middle"}, {"sname":"Lowell","stype":"high"},{"sname":"UCB","stype":"college"}]
以下の入れ子のTD_JSONSHRED呼び出しでは、"schools"配列内の個別JSONオブジェクト データを取得できます。内部関数呼び出しは、上記の関数呼び出しと同じです。上記の出力の各行では、schools列に有効なJSONドキュメントが含まれていることに注意してください。このため、その派生テーブルをTD_JSONSHREDへの別の呼び出しの入力として使用できます。
SELECT * FROM TD_JSONSHRED ( ON ( SELECT * FROM TD_JSONSHRED ( ON (SELECT id, jsondoc FROM JsonNestArrays) USING ROWEXPR('students') COLEXPR('schools') RETURNTYPES('VARCHAR(150)') ) AS d1 ) USING ROWEXPR('') COLEXPR('sname', 'stype') RETURNTYPES('VARCHAR(25)', 'VARCHAR(25)') ) AS d2;
id sname stype ----------- ------------------------- ------------------------- 1 Lake elementary 1 Madison middle 1 Rancho high 1 UCI college 1 Sloat elementary 1 Aptos middle 1 Lowell high 1 UCB college
各schoolに関連付けられたstudentの名前を示す列を含めるには、JSONドキュメントの"name"オブジェクトをTD_JSONSHREDへの内部呼び出しに含めます。以下の例では、最も外側のSELECT文での列名を別名にします。
SELECT name as student, stype as level, sname as school FROM TD_JSONSHRED ( ON ( SELECT * FROM TD_JSONSHRED ( ON (SELECT id, jsondoc FROM JsonNestArrays) USING ROWEXPR('students') COLEXPR('name','schools') RETURNTYPES('VARCHAR(15)','VARCHAR(150)') ) AS d1 ) USING ROWEXPR('') COLEXPR('sname', 'stype') RETURNTYPES('VARCHAR(25)', 'VARCHAR(25)') ) AS d2 ;
student level school --------------- ------------------------- ------------------------- Cameron elementary Lake Cameron middle Madison Cameron high Rancho Cameron college UCI Fred elementary Sloat Fred middle Aptos Fred high Lowell Fred college UCB