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演示