数据库教程:mysql 列转行的技巧(分享)分享

前言:

由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。

这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果。

表数据:

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

(0)
上一篇 2021年10月28日
下一篇 2021年10月28日

精彩推荐