1 行のデータを複数行に変換する UDTF です。列に格納されている、固定の区切り文字で分割された配列を複数行に変換します。
使用制限
-
keyとなるすべての列は先頭に配置し、転置する列は末尾に配置する必要があります。 -
1 つの
select句内では、UDTF は 1 つしか使用できず、他の列を含めることはできません。
コマンド構文
trans_array (<num_keys>, <separator>, <key1>,<key2>,…,<col1>,<col2>,<col3>) as (<key1>,<key2>,...,<col1>, <col2>, <col3>)
パラメーター
-
num_keys:必須。 複数行への変換時に転置
keyとなる列の数を、>=0の BIGINT 型定数で指定します。 -
separator:必須。STRING 型の定数で、文字列を複数の要素に分割するための区切り文字を指定します。空の場合はエラーが返ります。
-
keys:必須。転置時に
keyとなる列で、その数は num_keys で指定します。num_keys がすべての列をkeyとして指定する場合 (つまり、num_keys が列の総数と等しい場合)、1 行のみが返されます。 -
cols: 必須。 行に変換する配列を指定します。
keysの後にあるすべての列が、転置対象の配列と見なされます。このパラメーターは STRING 型である必要があり、格納する内容は、Hangzhou;Beijing;shanghaiのような、セミコロン (;) で区切られた文字列形式の配列です。
戻り値
転置後の行を返します。新しい列名はas で指定されます。key としての列の型は変更されず、残りのすべての列は STRING 型になります。分割後の行数は、要素数が最も多い配列に準じ、不足分は NULL で補われます。
使用例
-
例1:たとえば、テーブル
t_tableのデータは次のとおりです。+----------+----------+------------+ | login_id | login_ip | login_time | +----------+----------+------------+ | wangwangA | 192.168.0.1,192.168.0.2 | 20120101010000,20120102010000 | | wangwangB | 192.168.45.10,192.168.67.22,192.168.6.3 | 20120111010000,20120112010000,20120223080000 | +----------+----------+------------+ -- SQL を実行します。 select trans_array(1, ",", login_id, login_ip, login_time) as (login_id,login_ip,login_time) from t_table; -- 実行結果は次のとおりです。 +----------+----------+------------+ | login_id | login_ip | login_time | +----------+----------+------------+ | wangwangB | 192.168.45.10 | 20120111010000 | | wangwangB | 192.168.67.22 | 20120112010000 | | wangwangB | 192.168.6.3 | 20120223080000 | | wangwangA | 192.168.0.1 | 20120101010000 | | wangwangA | 192.168.0.2 | 20120102010000 | +----------+----------+------------+ -- テーブル内のデータが次のようになっている場合。 Login_id LOGIN_IP LOGIN_TIME wangwangA 192.168.0.1,192.168.0.2 20120101010000 -- 配列内の不足するデータは NULL で補完されます。 Login_id Login_ip Login_time wangwangA 192.168.0.1 20120101010000 wangwangA 192.168.0.2 NULL -
例 2:テーブル mf_fun_array_test_t のデータが次のようになっている場合。
+------------+------------+------------+------------+ | id | name | login_ip | login_time | +------------+------------+------------+------------+ | 1 | Tom | 192.168.100.1,192.168.100.2 | 20211101010101,20211101010102 | | 2 | Jerry | 192.168.100.3,192.168.100.4 | 20211101010103,20211101010104 | +------------+------------+------------+------------+ -- 2 つのキー (id と name) を使用して配列を転置する場合、SQL を実行します。 select trans_array(2, ",", Id,Name, login_ip, login_time) as (Id,Name,login_ip,login_time) from mf_fun_array_test_t; -- 実行結果は次のとおりです。キーである id と name によってグループ化され、展開されています。 +------------+------------+------------+------------+ | id | name | login_ip | login_time | +------------+------------+------------+------------+ | 1 | Tom | 192.168.100.1 | 20211101010101 | | 1 | Tom | 192.168.100.2 | 20211101010102 | | 2 | Jerry | 192.168.100.3 | 20211101010103 | | 2 | Jerry | 192.168.100.4 | 20211101010104 | +------------+------------+------------+------------+
関連関数
TRANS_ARRAY 関数はその他の関数に属し、その他のビジネスシナリオの関数については、「その他の関数」をご参照ください。