MYSQL 列转行方法
MYSQL 列转行方法
目标
上周遇到个业务场景,要求把一列中用分隔符连接的数据,通过分隔符转多行,形如:
转为
准备
表结构
CREATE TABLE `t_tag` (`id` int NOT NULL AUTO_INCREMENT,`tags` varchar(255) DEFAULT NULL COMMENT '标签;分隔',PRIMARY KEY (`id`)
) ENGINE=InnoDB;
操作:
a.使用CAHR_LENGTH()获取每行tags内tag数量
tags内tag数量即分隔符数+1
注:使用CAHR_LENGTH()函数计算字符个数,对于存储内容为字母/数字也可用LENGTH()函数获取字符字节数,utf8编码下,每个字母/数字都只占一个字节,但一个汉字占3个字节,所以获取字符个数推荐使用CHAR_LEGTN()更准确
SELECTid,tags,CHAR_LENGTH( tags )- CHAR_LENGTH(REPLACE ( tags, ';', '' ))+ 1 AS tagCount
FROMt_tag
结果:
b.通过SUBSTRING_INDEX()切割tag
① SUBSTRING_INDEX(str,delim,count) 用法,该函数三个参数分别为 字符串、分割符、第n个分隔符
例如 substring_index(‘1;2;3’, ‘;’, 2) 的结果是1;2:表示取第二个分隔符左边的子串;
若第三个参数为负数,则表示取倒数第n个分隔符右边的子串,如:substring_index(‘1;2;3’, ‘;’, -1)结果为3
对于多个分隔符,取中间的 tag 用两层SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ‘;’, -1), ‘;’ n) 就都可以拿到了,比如
-- 结果是 1, 内层substring_index结果是 '1', 外层再取 '1' 的倒数第一个分隔符;右边 结果还是1
SELECT substring_index(substring_index('1;2;3', ';', 1), ';', -1);
-- 结果是 2, 内层substring_index结果是 '1;2', 外层再取 '1;2' 的倒数第一个分隔符;右边 结果是2
SELECT substring_index(substring_index('1;2;3', ';', 2), ';', -1);
-- 结果是 3, 内层substring_index结果是 '1;2;3', 外层再取 '1;2;3' 的倒数第一个分隔符;右边 结果是3
SELECT substring_index(substring_index('1;2;3', ';', 3), ';', -1);
这样就分别取到了 tags 内的分隔符隔开的 第一项,第二项 和 第三项,现在只要保证内层substring_index中的n是根据 tag 数量递增就行,这里使用了 mysql.help_topic 表的自增 help_topic_id
c.通过mysql.help_topic 表的自增 help_topic_id 作为substring_index的分割点
②要借助一张 mysql.help_topic 表的从0开始的自增 help_topic_id,通过笛卡尔积join出得help_toppic_id作为分割点
先看下 mysql.help_topic 结构: SELECT * FROM mysql.help_topic
其他字段不用管,可以看到 mysql.help_topic 的 help_topic_id 是从零开始自增的,结合此处分割点 n 从1开始 到 tag 数的场景,使用时要 对help_topic_id+1
注: mysql.help_topic 我这里看只有701条数据,即help_topic_id 只自增到700,所以 tags 中要分割的tag > 700,可另找或自建其他自增id更多的表
通过 join mysql.help_topic 获取分割点
SELECTa.id,a.tags,b.help_topic_id + 1 AS '分割点'
FROMt_tag AS aJOIN mysql.help_topic AS b ON b.help_topic_id < CHAR_LENGTH( tags )- CHAR_LENGTH(REPLACE ( tags, ';', '' ))+ 1
结果可以看到分割点 都获取到了:
再把分割点带入 substring_index(substring_index(tags, ‘;’, n), ‘;’, -1) 即可得到所需的结果
SELECTa.id,a.tags,SUBSTRING_INDEX(SUBSTRING_INDEX(tags,';', b.help_topic_id + 1), ';',-1) AS tag
FROMt_tag AS aJOIN mysql.help_topic AS b ON b.help_topic_id < CHAR_LENGTH( tags )- CHAR_LENGTH(REPLACE ( tags, ';', '' ))+ 1
得到最终转列之后的结果:
参考:MySQL 固定分隔符列转行
MYSQL 列转行方法相关推荐
- mysql 列转行 unpivot_Spark SQL中列转行(UNPIVOT)的两种方法
行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 测试数据准备 本文的环 ...
- mysql 分组 列转行,mysql列转行以及年月分组实例
如下所示: SELECT count(DISTINCT(a.rect_id)) zcount, a.job_dept, DATE_FORMAT(submit_date, '%Y-%m') zsubmi ...
- mysql列转行统计查询_Mysql 列转行统计查询 、行转列统计查询
Mysql group_concat函数列转行,与行转列 例一: SELECT num from user 1.使用group_concat函数得到列转行 select group_concat(nu ...
- MySQL 列转行用法实现
需求 需要将如下所示原始表数据转为结构化的数据按行显示: 转为结构化数据: 解决方法 如果是单条记录通过SUBSTRING_INDEX容易实现,SQL语句如下: select name,SUBSTRI ...
- 不使用union实现Mysql 列转行
最近工作上用到了 mysql列转行,网上找了一堆大多数都是行转列的方法,对于列转行这块,仅找到了union这一种方式,偏偏工作环境的数据库版本较低不支持临时表,使用union方式写起来又过于笨重,所以 ...
- Kettle使用_27 行转列与列转行方法汇总
Kettle使用_27 行转列与列转行方法汇总 需求:通过kettle实现行列转换与列转行. 解决方法:主要通过排序记录.行专列.列转行.行扁平化组件解决. Previous work: 这里的数据是 ...
- mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...
mysql中的列转行 在工作中遇到的一个MySQL列转行的统计: 场景 用户访问app时会跳出标签选择页面让用户选择喜欢的标签,在数据库中记录的是数组样式的字符串,数据样式大致如下: id user_ ...
- excel根据条件列转行_“Excel怎样将列转为行 Excel列转行方法“excel有条件转置
EXCEL中如何将大量竖列数据一次性转为横行.如图. 很简单就可实现,用QQ说吧..87017761打字很麻烦.. Excel怎样将列转为行 Excel列转行方法 目标:将一列数转数据,比如将A列数据 ...
- mysql 分组 列转行,mysql列转行以及年月分组_MySQL
bitsCN.com mysql列转行以及年月分组 Java代码 SELECT count(DISTINCT(a.rect_id)) zcount, a.job_dept, DATE_FORMAT(s ...
最新文章
- blade企业级开发平台
- 和计算机互动英语,计算机专业英语互动教学方法探讨
- java面向对象(引用类型--参数传递)
- 台式电脑耳机插孔在哪_吉林戴尔电脑音箱维修app,查看详情_曹操闪修
- 临界区设计太大或太小有何缺点_空压机100课之016:离心式压缩机的结构、原理及优缺点...
- Eclipse IDE的安装与配置
- 损失函数、tensorflow2实现——Python实战
- OAuth 2 开发人员指南(Spring security oauth2)
- 精彩收集的303个透明flash代码
- vuetify图标不正常显示
- pip 使用国内阿里云软件源
- ubuntu终端英文乱码问题
- idea 2020,2021,2022石皮-解到2099年怎么搞
- 惊悚游戏《寂静岭》厕所3D场景模型制作分享
- 在CubieTruck上安装TF卡版的armbian
- 这样print才够劲!
- 如何用python画笑脸QQ表情——turtle库实践
- Python学习第一课——爬取模特秀网站的模特图片
- storyboard搭建项目_轻松搞定一人一个storyboard开发
- 轻松实现富文本编辑器
热门文章
- 从C到C++衔接——浅析两种语言的差别
- docker更换国内镜像(网易docker镜像)解决docker下载镜像慢问题
- Week1.3-金融会计指标案例分析
- html银河特效编码,html5 canvas银河星系动画特效
- SQL调优指南笔记6:Explaining and Displaying Execution Plans
- 一级造价工程师(安装)- 计量笔记 - 第五章第二节通风空调工程
- Android App集成支付宝
- [Leetcode][分治法]相关题目汇总/分析/总结
- 保存numpy数组到excel
- 中断处理过程示意图_中断服务程序流程图