SQL拆分逗号分隔的行

我有一个可变数量的逗号分隔值的列:

somethingA,somethingB,somethingC somethingElseA, somethingElseB 

我想要结果采取每个值,并创build一个行:

 somethingA somethingB somethingC somethingElseA somethingElseB 

我怎么能在SQL(MySQL)中做到这一点?

(我试过用googlesearch“内爆”和“侧面看”,但似乎没有提出相关的问题,所有相关的问题都试图做更复杂的事情)

你可以像这样用纯SQL来完成

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', nn), ',', -1) value FROM table1 t CROSS JOIN ( SELECT aN + bN * 10 + 1 n FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b ORDER BY n ) n WHERE nn <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) ORDER BY value 

注意:诀窍是利用计数(数字)表,在这种情况下MySQL函数SUBSTRING_INDEX()非常方便。 如果你做了很多这样的查询(拆分),那么你可能会考虑填充和使用一个持久化的TALL表,而不是像本例中那样使用子查询来dynamic生成它。 本示例中的子查询生成一个从1到100的数字序列,有效地允许您在源表中将每行分割为100个定界值。 如果您需要更多或更less,您可以轻松调整它。

输出:

 |  VALUE |
 | ---------------- |
 |  somethingA |
 |  somethingB |
 |  somethingC |
 |  somethingElseA |
 |  somethingElseB |

这里是SQLFiddle演示


这是查询可能如何使用持久性计数表查看

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', nn), ',', -1) value FROM table1 t CROSS JOIN tally n WHERE nn <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) ORDER BY value 

这里是SQLFiddle演示