mysql查询含逗号的数据,将逗号拆分为多行展示:
原始数据如下:
ID | VALUE |
---|---|
1 | yang,zheng,song |
2 | zhao,qian,sun |
3 | jiang |
现在因为新的需求,需要将这些数据转化为如下形式:
ID | VALUE |
---|---|
1 | yang |
1 | zheng |
1 | song |
2 | zhao |
2 | qian |
2 | sun |
3 | jiang |
假设我们需要处理的表结构为:
NAME | TYPE | LEN |
---|---|---|
ID | INT | 11 |
NAME | VARCHAR | 255 |
使用如下sql语句即可实现需求:
SELECT a.id,
substring_index( substring_index( a.name, ',', b.help_topic_id + 1 ), ',',- 1 ) name
FROM table1 a
JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 )
ORDER BY a.id
查询的主要思路为,原表与一个包含连续自增长字段的表进行join,得到字符串分隔后的索引值,其中length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1
语句获得字符串逗号分隔之后得到的数据长度,两表关联之后,会得到相应行数的数据。比如,
1 | yang,zheng.song |
---|
在join之后会得到:
ID | NAME | HELP_TOPIC_ID |
---|---|---|
1 | yang,zheng,song | 0 |
1 | yang,zheng,song | 1 |
1 | yang,zheng,song | 2 |
之后对查询中的结果,使用substring_index方法进行截取,然后得到我们自己想要的数据。
备注:我们在join的时候借助了mysql.help_topic表,表中的help_topic_id是从0到582连续自增的数值,如果遇到数据经过逗号分隔之后得到的数组长度大于582,则需要自己建立一个连续自增表来进行join,比如:
create table incre_table (AutoIncreID int);
insert into incre_table values (0);
insert into incre_table values (1);
insert into incre_table values (2);
网友评论