前言:
由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。
这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果。
表数据:
ID Value 1 tiny,small,big 2 small,medium 3 tiny,big
期望得到结果:
ID Value 1 tiny 1 small 1 big 2 small 2 medium 3 tiny 3 big
正文:
#需要处理的表 createtabletbl_name(IDint,mSizevarchar(100)); insertintotbl_namevalues(1,'tiny,small,big'); insertintotbl_namevalues(2,'small,medium'); insertintotbl_namevalues(3,'tiny,big'); #用于循环的自增表 createtableincre_table(AutoIncreIDint); insertintoincre_tablevalues(1); insertintoincre_tablevalues(2); insertintoincre_tablevalues(3);
selecta.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1) from tbl_namea join incre_tableb onb.AutoIncreID<=(length(a.mSize)-length(replace(a.mSize,',',''))+1) orderbya.ID;
原理分析:
这个join最基本原理是笛卡尔积。通过这个方式来实现循环。
以下是具体问题分析:
length(a.Size)-length(replace(a.mSize,’,’,”))+1 表示了,按照逗号分割后,改列拥有的数值数量,下面简称n
join过程的伪代码:
根据ID进行循环
{
判断:i是否<=n
{
获取最靠近第i个逗号之前的数据,即substring_index(substring_index(a.mSize,’,’,b.ID),’,’,-1)
i=i+1
}
ID=ID+1
}
上述就是数据库技术:mysql 列转行的技巧(分享)分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/dtteaching/914107.html