sql一行一列拆分成多行技巧

MySQL用substring_index+表连接拆分,Oracle用UNION ALL或CONNECT BY LEVEL。
别这么干,用动态SQL效率高。

mysql将一列拆分为多列

拆分列,用函数和JOIN。

固定分隔符,用SUBSTRING_INDEX和CROSSJOIN。

已知值拆分,用CASE和聚合函数。

数据备份,防止丢失。

选对方法,别瞎搞。

Mysql拆分一行为多行

哎哟,说起来这个拆分逗号分隔值的操作,我还真是踩过不少坑呢。
记得那会儿,有个项目,数据导入的时候,用户上传的文本数据,字段之间都是用逗号分隔的,结果导入到数据库里,数据就乱成一锅粥了。
那会儿我还不懂这些复杂的函数,就想着手动去处理,结果搞了好久都没搞定。

后来啊,我慢慢学了点MySQL的函数,发现这事儿其实可以通过结合一些字符串函数和数字辅助表来解决。
比如说,创建一个数字辅助表,生成一个1 到1 00的数字序列,这样我们就可以用这个序列来定位逗号的位置。

当时我就是这样操作的,首先创建了一个数字辅助表,这个表里就是一列数字,从1 到1 00,然后我用这个表和原始表做连接,通过一些函数来计算分隔符的数量,再利用SUBSTRING_INDEX函数来提取每个值。
这个过程我还真是费了不少劲,不过最后搞定了,数据也顺利拆分成了多行。

我记得当时我是这么写的:
sql WITH RECURSIVE numbers AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM numbers WHERE n < 1 xss=clean>LENGTH(REPLACE(t.name, ',', '')) + 1 ORDER BY t.id, n.n;
这其中的关键点嘛,就是数字辅助表要生成足够多的数字,以保证能覆盖所有的分隔符。
然后通过计算分隔符的数量,来确定总共有多少个值,最后用SUBSTRING_INDEX函数来提取每个值。

还有,如果用MySQL 8 .0及以上版本,还可以用JSON函数来简化这个过程,不过这个我那时候还没接触过,就不敢乱讲了。

总之,这个方法还挺高效的,后来我用它解决了不少类似的场景。
不过啊,要注意性能问题,如果数据量大的话,创建一个永久的数字辅助表会好一些。
还有,要记得添加WHERE条件来过滤掉无效数据,比如说NULL或者空字符串。
如果需要处理其他分隔符,还可以修改REPLACE函数的参数。

现在回想起来,那会儿真是有点傻,不过也正因为这些经历,我才能学到这么多东西。
哈哈,不扯远了,总之,这个拆分逗号分隔值的方法还是挺实用的。