碰到一个需求: 表中的记录如下格式
id val
1 222,333
2 333,444,45,5556
需要拆分为如下结构
id val
1 222
1 333
2 333
2 444
2 45
2 5556
方法如下:
1、给表增加两个临时字段 sub, leng用来存放临时结果
2、用SUBSTRING_INDEX获取每一行记录第一个”,”号之前的字符串,存放在sub字段里
3、记录sub长度,保存在leng里
4、将val字段更新为从leng+2个位置开始 的字符串,
5、将id sub字段select 并 insert 如另外一个临时表
6、重复 2 3 4 5步骤,知道该表为空
7、将临时表记录读到该表,或者将改变删除,临时表更名为该表名
关于SUBSTRING_INDEX,LENGTH,SUBSTRING的使用说明
1、SUBSTRING_INDEX,函数原型 SUBSTRING_INDEX(str,delim,count) 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符。
2、LENGTH,函数原型LENGTH(STR),计算字符串的长度
3、SUBSTRING,SUBSTRING(STR , start , length ),截取STR从start位置开始截取字符,截取length长度,或者直至字符串结束,任何一个满足条件见就终止。
sql:
alter table testa add column sub varchar(255) default ”;
alter table testa add column leng smallint(5) default 0;
update testa set sub = substring_index(str,”,”,1);
update testa set leng = length(sub);
update testa set str = substring(str,leng+2);
insert into testb(str,testa_id) select sub,id from testa;
delete from testa where str = ”;