例: TD_JSONSHRED複数潜在行式 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - JSONデータ型

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年9月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/gzn1554761068186.ditamap
dita:ditavalPath
ja-JP/gzn1554761068186.ditaval
dita:id
evi1472243742653
Product Category
Software
Teradata Vantage

これらの例では、複数潜在行式によるJSONデータのシュレッドに使用できる2つの方法を示します。

CREATE MULTISET TABLE jsonTable
(
    id INTEGER,
    data JSON
);

テーブルに、シュレッドするサンプルJSONデータを入力します。rowData1rowData2abを抽出します。

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回の処理でシュレッドされます。