mysql中如何将存在分隔符号的一列进行拆分,成为多行![如何将左图处理成右图效果](https://i-blog.csdnimg.cn/blog_migrate/828ede877eb09209fc9db1761b516f9d.png)
-- ****************************** 写在前面的说明 **********************************
/* student 为 上面左图的表名,表内字段名称见上图;
1.一个中文符号或者文字长为3,一个英文字母或者一个英文状态下得符号长为1 ;
2.函数substring_index(string,sep,num),即substring_index(字符串,分隔符,序号),参数说明:
string:用于截取目标字符串的字符串。可为字段,表达式等;
sep:分隔符,string存在且用于分割的字符,比如“,”、“.”等;
num:序号,为非0整数。若为整数则表示从左到右数,若为负数则从右到左数。
例子:比如“www.mysql.com”截取字符‘www’,分割符为“.”,从左到右序号为1,即substring_index("www.mysql.com",'.',1);若从右开始获取“com”则为序号为-1即substring_index("www.mysql.com",'.',-1)。
*/
-- ****************************** 写在前面的说明 **********************************
-- --------------------------------------------------------------------------------
-- ****************************** 具体的sql及注释**********************************
SELECT
a.sage,
-- /*先正着取出几部分*/,然后在此基础再倒着取出最后那一部分
substring_index( substring_index(a.sname,',',b.help_topic_id + 1),',' ,- 1 ) AS split_name
from
-- 将原数据先取出来 like中的符号与实际表里字段中的分割符对应
(select sname,sage from student where sname like '%,%') a -- 如果表内还存在没有分隔符,就单个值的则直接select sname,sage from student 就行,总之目的是取出要处理的数据
join
mysql.help_topic b -- mysql帮助表 内含字符等 ,help_topic_id是从0开始的,其实使用的是它的计数功能
ON -- on的条件筛选结束后,如果改行此字段分割完后有三部分,则总共产生3条记录
b.help_topic_id < ( length(a.sname) - length(REPLACE (a.sname, ',', '')) + 1 ) -- 实际算出的是分割后总共有几部分(此处是将长度为1的英文状态替换成空)