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 列转行方法相关推荐

  1. mysql 列转行 unpivot_Spark SQL中列转行(UNPIVOT)的两种方法

    行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 测试数据准备 本文的环 ...

  2. mysql 分组 列转行,mysql列转行以及年月分组实例

    如下所示: SELECT count(DISTINCT(a.rect_id)) zcount, a.job_dept, DATE_FORMAT(submit_date, '%Y-%m') zsubmi ...

  3. mysql列转行统计查询_Mysql 列转行统计查询 、行转列统计查询

    Mysql group_concat函数列转行,与行转列 例一: SELECT num from user 1.使用group_concat函数得到列转行 select group_concat(nu ...

  4. MySQL 列转行用法实现

    需求 需要将如下所示原始表数据转为结构化的数据按行显示: 转为结构化数据: 解决方法 如果是单条记录通过SUBSTRING_INDEX容易实现,SQL语句如下: select name,SUBSTRI ...

  5. 不使用union实现Mysql 列转行

    最近工作上用到了 mysql列转行,网上找了一堆大多数都是行转列的方法,对于列转行这块,仅找到了union这一种方式,偏偏工作环境的数据库版本较低不支持临时表,使用union方式写起来又过于笨重,所以 ...

  6. Kettle使用_27 行转列与列转行方法汇总

    Kettle使用_27 行转列与列转行方法汇总 需求:通过kettle实现行列转换与列转行. 解决方法:主要通过排序记录.行专列.列转行.行扁平化组件解决. Previous work: 这里的数据是 ...

  7. mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...

    mysql中的列转行 在工作中遇到的一个MySQL列转行的统计: 场景 用户访问app时会跳出标签选择页面让用户选择喜欢的标签,在数据库中记录的是数组样式的字符串,数据样式大致如下: id user_ ...

  8. excel根据条件列转行_“Excel怎样将列转为行 Excel列转行方法“excel有条件转置

    EXCEL中如何将大量竖列数据一次性转为横行.如图. 很简单就可实现,用QQ说吧..87017761打字很麻烦.. Excel怎样将列转为行 Excel列转行方法 目标:将一列数转数据,比如将A列数据 ...

  9. mysql 分组 列转行,mysql列转行以及年月分组_MySQL

    bitsCN.com mysql列转行以及年月分组 Java代码 SELECT count(DISTINCT(a.rect_id)) zcount, a.job_dept, DATE_FORMAT(s ...

最新文章

  1. blade企业级开发平台
  2. 和计算机互动英语,计算机专业英语互动教学方法探讨
  3. java面向对象(引用类型--参数传递)
  4. 台式电脑耳机插孔在哪_吉林戴尔电脑音箱维修app,查看详情_曹操闪修
  5. 临界区设计太大或太小有何缺点_空压机100课之016:离心式压缩机的结构、原理及优缺点...
  6. Eclipse IDE的安装与配置
  7. 损失函数、tensorflow2实现——Python实战
  8. OAuth 2 开发人员指南(Spring security oauth2)
  9. 精彩收集的303个透明flash代码
  10. vuetify图标不正常显示
  11. pip 使用国内阿里云软件源
  12. ubuntu终端英文乱码问题
  13. idea 2020,2021,2022石皮-解到2099年怎么搞
  14. 惊悚游戏《寂静岭》厕所3D场景模型制作分享
  15. 在CubieTruck上安装TF卡版的armbian
  16. 这样print才够劲!
  17. 如何用python画笑脸QQ表情——turtle库实践
  18. Python学习第一课——爬取模特秀网站的模特图片
  19. storyboard搭建项目_轻松搞定一人一个storyboard开发
  20. 轻松实现富文本编辑器

热门文章

  1. 从C到C++衔接——浅析两种语言的差别
  2. docker更换国内镜像(网易docker镜像)解决docker下载镜像慢问题
  3. Week1.3-金融会计指标案例分析
  4. html银河特效编码,html5 canvas银河星系动画特效
  5. SQL调优指南笔记6:Explaining and Displaying Execution Plans
  6. 一级造价工程师(安装)- 计量笔记 - 第五章第二节通风空调工程
  7. Android App集成支付宝
  8. [Leetcode][分治法]相关题目汇总/分析/总结
  9. 保存numpy数组到excel
  10. 中断处理过程示意图_中断服务程序流程图