前言:

鉴于不少业务表因为历史原因也许性质原因,都应用了违反第贰范式的设计格局。即同3个列中贮存了四个属性值(具体组织见下表)。

这种情势下,应用经常需求将以此列依附分隔符实行私分,并获得列转行的结果。

 

表数据:

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

 

MySQL逗号分割字段的列转行,mysql逗号字段转行

总结:

这种方法的重疾在于,大家须求三个独具几次三番数列的独立表(这里是incre_table)。并且总是数列的最大值一定要高于符合分割的值的个数。

举个例子有1行的mSize 有91九个逗号分割的值,那么大家的incre_table
就必要有起码九十九个一而再行。

本来,mysql内部也有现有的连天数列表可用。如mysql.help_topic:
help_topic_id 共有50四个数值,一般能满足于超越二分之一须求了。

改写后如下:

#需要处理的表
create table tbl_name (ID int ,mSize varchar(100));
insert into tbl_name values (1,'tiny,small,big');
insert into tbl_name values (2,'small,medium');
insert into tbl_name values (3,'tiny,big');


#SQL
select a.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1) 
from 
tbl_name a
join
mysql.help_topic b
on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1)
order by a.ID;

 

前言:

出于过多业务表因为历史由来依旧性质原因,都使用了违背第壹范式的设计格局。即同多个列中存款和储蓄了多个属性值(具体组织见下表)。

这种形式下,应用平日必要将那一个列依附分隔符进行剪切,并赢得列转行的结果。

 

4503.com,表数据:

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