UDTF qui transforme une ligne de données en plusieurs lignes en convertissant les tableaux stockés dans des colonnes (séparés par un délimiteur fixe) en lignes distinctes.
Limites d'utilisation
Placez toutes les colonnes servant de
keyen premier, et les colonnes à transposer à la fin.Une instruction
selectne peut contenir qu'une seule UDTF ; aucune autre colonne n'est autorisée.
Syntaxe
trans_array (<num_keys>, <separator>, <key1>,<key2>,…,<col1>,<col2>,<col3>) as (<key1>,<key2>,...,<col1>, <col2>)
Paramètres
num_keys : Obligatoire. Constante de type BIGINT dont la valeur doit être
>=0. Indique le nombre de colonnes servant dekeylors de la transposition en plusieurs lignes.separator : Obligatoire. Constante de type STRING représentant le délimiteur utilisé pour scinder la chaîne en plusieurs éléments. Une erreur est renvoyée si cette valeur est vide.
keys : Obligatoire. Colonnes servant de
keylors de la transposition ; leur nombre est défini par num_keys. Si num_keys spécifie que toutes les colonnes servent dekey(c'est-à-dire que num_keys est égal au nombre total de colonnes), une seule ligne est renvoyée.cols : Obligatoire. Tableaux à convertir en lignes. Toutes les colonnes situées après
keyssont considérées comme les tableaux à transposer. Elles doivent être de type STRING et contenir des chaînes formatées en tableau, par exempleHangzhou;Beijing;shanghai, qui constitue un tableau délimité par des points-virgules (;).
Valeurs de retour
Renvoie les lignes transposées, dont les nouveaux noms de colonnes sont spécifiés par as. Le type des colonnes servant de key reste inchangé, tandis que toutes les autres colonnes sont de type STRING. Le nombre de lignes générées correspond à celui du tableau le plus long ; les valeurs manquantes sont complétées par NULL.
Exemples
-
Exemple 1 : Supposons que la table
t_tablecontienne les données suivantes.+----------+----------+------------+ | 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 -
Exemple 2 : Supposons que la table mf_fun_array_test_t contienne les données suivantes.
+------------+------------+------------+------------+ | 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 | +------------+------------+------------+------------+ --用两个key,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; --返回结果如下,已经对key,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 | +------------+------------+------------+------------+
Fonctions associées
La fonction TRANS_ARRAY appartient à la catégorie des autres fonctions. Pour plus d'informations sur les fonctions dédiées à d'autres scénarios métier, consultez Autres fonctions.