在实际数据处理中,可能会遇到行列转换的数据处理,在 MaxCompute 与 AnalyticDB MySQL 数据处理与转换 介绍过如多行转一行,本篇主要介绍将逗号分割的字段转成多行。
一、MaxCompute 实现方式
在MaxCompute中有TRANS_ARRAY函数,可将列中存储的以固定分隔符格式分隔的数组转为多行。
格式如下:
TRANS_ARRAY(num_keys, separator, key1,key2,…,col1, col2,col3) as (key1,key2,…,col1, col2)
● num_keys: bigint类型常量,必须>=0。在转为多行时作为转置key的列的个数。
Key是指在将一行转为多行时,在多行中重复的列。
● separator:String类型常量,非空,用于将字符串拆分成多个元素的分隔符。
● keys:转置时作为key的列, 个数由num_keys指定。如果num_keys指定所有的列都作为key(即num_keys等于所有列的个数),则只返回一行。
● cols::要转为行的数组,keys之后的所有列视为要转置的数组,必须为string类型,存储的内容是字符串格式的数组。
函数实现的 Demo 如下所示。
SELECT TRANS_ARRAY(1,'-',t1.c1,t1.c0,t1.c2) AS (c0,c1,c2)
FROM (
SELECT 'aa-bb-cc-dd' AS c0,
'ee' AS c1,
'ff-qq' AS c2
) AS t1
c2个数不足,会补空,执行结果如下图所示。
二、Mysql 实现方式
MySQL 实现方式主要用到 mysql.help_topic 解释表,表的ID是递增的,方便计数。主要思想是利用序列和字符串的截取。
函数 substring_index 截取字符串。
函数substring_index 格式为
substring_index(parent_str,child_str,num)
parent_str 待截取的字符串,即父串;
child_str 要截取的字符串,即子串
num 截取的位置
实现的SQL如下所示。
SET @phone_str = '小米,苹果,华为';
SELECT
help_topic_id,
length(@ncr_str) as phone_num,
length(REPLACE(@phone_str, ',', '')) as phone_str_num,
length(@ncr_str) - length(REPLACE(@phone_str, ',', '')) + 1 as num,
substring_index(@phone_str, ',', help_topic_id + 1) as now_str,
substring_index(substring_index(@phone_str, ',', help_topic_id + 1), ',', -1) as str_name
FROM
mysql.help_topic
WHERE
help_topic_id < length(@ncr_str) - length(REPLACE(@phone_str, ',', '')) + 1;
条件为序列的长度,展示的列为字符串的截取,截取的结果如下所示。
参考博客
【1】https://blog.csdn.net/iuie_sl/article/details/95310574