关键函数

substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数

例子:
str=f.s.z
substring_index(str,’.’,1)
结果是:f
substring_index(str,’.’,2)
结果是:f.s
也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容
相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:
substring_index(str,’.’,-2)
结果为:s.z
有人会问,如果我要中间的的s怎么办?
很简单的,两个方向:
从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:
substring_index(substring_index(str,’.’,-2),’.’,1);

原始数据

MySQL根据分隔符将一行数据拆分成多行数据 - 图1

处理结果展示

MySQL根据分隔符将一行数据拆分成多行数据 - 图2

SQL语句

  1. SELECT
  2. a.id,
  3. a.email,
  4. substring_index(
  5. substring_index(
  6. a.name,
  7. ',',
  8. b.id+1
  9. ),
  10. ',',-1
  11. ) AS splitName
  12. FROM
  13. t_emp a
  14. join
  15. (
  16. SELECT
  17. (
  18. @ROW :=@Row + 1
  19. ) AS id
  20. FROM
  21. t_user,
  22. (
  23. SELECT @Row:=-1
  24. ) AS zz
  25. ) AS b ON b.id < (
  26. length(a.name) - length(
  27. replace(a.name,',','')
  28. ) + 1
  29. )
  30. ORDER BY a.id

小结

  1. 序列表必须从0开始,行数与最多的逗号个数有关,行数至少比最长逗号个数加1,可以建0~1000。(其实也可以不从0开始,但是sql语句要做相对应的修改)
  2. 为什么不用MySQL自带的自增序列表mysql.help_topic?因为好多公司的数据库是没有权限操作这些表的, 不能使用。

自己实例

  1. SELECT a.id,
  2. a.parentid,
  3. substring_index(
  4. substring_index(
  5. a.parentid,
  6. '-',
  7. b.id + 1
  8. ),
  9. '-', -1
  10. ) AS splitName
  11. FROM org_department_dictionary a
  12. join
  13. (
  14. SELECT (
  15. @ROW := @Row + 1
  16. ) AS id
  17. FROM org_department_dictionary,
  18. (
  19. SELECT @Row := -1
  20. ) AS zz
  21. ) AS b ON b.id < (
  22. length(a.parentid) - length(
  23. replace(a.parentid, '-', '')
  24. ) + 1
  25. )
  26. ORDER BY a.id