为了账号安全,请及时绑定邮箱和手机立即绑定

数据库知识点(3)——单行转多列

标签:
MySQL

此篇写单行转多列的方法。 其中用到的函数有replace(),length(),char_length(),substring(),substring_index(),concat()。首先会介绍各个函数的用法,之后会贴出单行转多列的语句。
应用场景是一个学生表,在班级字段中保存了该名学生上过的班级,并用“;”号分隔,要转换成一行是一个班级的格式。同样适用于一个字段中保存多个手机号。

函数如下:

replace('a','b','c');从字符串a中搜索字符串b,并用字符串c代替。

length(a);获取a对应字段的字节长度。

char_length(a);获取a的字符串长度。

个人理解就是char_length()得到的是看到的字符串的长度,而length()字节则是编码转化的长度,例如一个UTF-8的汉字是3个字节,是一个字符。

concat('a','b','c');将字符串a,b,c连接起来。

substring('a',b,c);在字符串a中从位置b开始,截去长度为c的字符串。b,c都是整数。b要求大于等于1。

substring_index('a','b',c);展示在字符串a中,第c次出现字符串b之前的字符串。a,b都是字符串,c是整数。

具体转换

学生表
图片描述

新建一个tb_sequence表,用来和student表cross join 获得笛卡尔乘积,先得到多列。表中只有一个ID,是自动递增的INT。
tb_sequence
图片描述

首先用corss join 获得多列,这里要记得给 cross join 后的查询结果集一个别名,不然报错。
图片描述

之后运用之前介绍的函数从className中截取出需要的字符串。这个过程是相当眼晕的,写完需要一瓶眼药水。这里主要利用了要处理的字符串格式统一的特点,都是4个字符串长度,像手机号码之类的可以类似处理,如果是不规则的还要自己再探索下。
图片描述

select name,
  substring(replace(className,';',''),char_length(replace(substring_index(className,';',a.id -1),';',''))+1,4) as className 
from tb_sequence a cross join (
    select id, name,className,length(className)-length(replace(className,';','')) as size from student b
)b  
on a.id<=b.size order by b.id;
点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
103
获赞与收藏
598

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消