MaxCompute与 Mysql 之单字段转多行

在实际数据处理中,可能会遇到行列转换的数据处理,在 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值