亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

數據庫知識點(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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消