MaxCompute与 Mysql 之单字段转多行

  • Post author:
  • Post category: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



版权声明:本文为u012190388原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。