これらの例では、複数潜在行式によるJSONデータのシュレッドに使用できる2つの方法を示します。
CREATE MULTISET TABLE jsonTable ( id INTEGER, data JSON );
テーブルに、シュレッドするサンプルJSONデータを入力します。rowData1とrowData2でaとbを抽出します。
INSERT INTO jsonTable VALUES (1, '{ "rowData1": [ { "a" : 1, "b" : "a" }, { "a" : 2, "b" : "b" }, { "a" : 3, "b" : "c" } ], "rowData2": [ { "a" : 4, "b" : "d" }, { "a" : 5, "b" : "e" }, { "a" : 6, "b" : "f" } ] }');
次の挿入では、ここでイベントの順序を示すために、同じid 1を意図的に使用しています。
INSERT INTO jsonTable VALUES (1, '{ "rowData1": [ { "a" : 7, "b" : "g" }, { "a" : 8, "b" : "h" }, { "a" : 9, "b" : "i" } ], "rowData2": [ { "a" : 10, "b" : "j" }, { "a" : 11, "b" : "k" }, { "a" : 12, "b" : "l" } ] }');
- メソッド1: JsonExtractを使用
考慮事項:
- 入力はJSONであるか、JSONに変換する必要があります。このため、16MBのサイズ制限があります。
- JSONPathに依存し、複雑になる可能性があります。
SELECT id, data.JsonExtract('$.[rowData1,rowData2][*]') FROM jsonTable; SELECT a, b FROM TD_JSONSHRED (ON (SELECT id, data.JsonExtract('$.[rowData1,rowData2][*]') FROM jsonTable) USING ROWEXPR('') COLEXPR('a', 'b') RETURNTYPES ('INTEGER', 'VARCHAR(10)') ) d(id, a, b) ;
出力:
a b ----------- ---------- 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j 11 k 12 l
- メソッド2: UNION ALL
この方法はより柔軟です。
- JSONPathについて詳しい知識は必要ありません。
- 入力データにはサイズ制限がありません。ただし、データのシュレッディングは複数回行われ、パフォーマンスに影響します。
SELECT a, b FROM TD_JSONSHRED (ON (SELECT id, data FROM jsonTable) USING ROWEXPR('rowData1') COLEXPR('a', 'b') RETURNTYPES ('INTEGER', 'VARCHAR(10)') ) d(id, a, b) UNION ALL SELECT a, b FROM TD_JSONSHRED (ON (SELECT id, data FROM jsonTable) USING ROWEXPR('rowData2') COLEXPR('a', 'b') RETURNTYPES ('INTEGER', 'VARCHAR(10)') ) d2(id, a, b) ;
出力:
a b ----------- ---------- 1 a 2 b 3 c 7 g 8 h 9 i 4 d 5 e 6 f 10 j 11 k 12 l
を使用
出力値のシーケンスは各方法で異なるので注意してください。JsonExtractを使用する最初のクエリーでは、行データが一度で処理されます。UNION ALLを使用する2番目のクエリでは、同じデータが2回の処理でシュレッドされます。