这个问题已经在这里有了答案 :
MySQL:将逗号分隔的列表分成多行 (4个答案)
6年前关闭。
我有一列带有可变数量的逗号分隔值:
somethingA,somethingB,somethingC somethingElseA, somethingElseB
我希望结果采用每个值,并创建一行:
somethingA somethingB somethingC somethingElseA somethingElseB
如何在SQL(MySQL)中执行此操作?
(我曾尝试使用谷歌搜索“内爆”和“侧面视图”,但是这些似乎并没有出现相关问题。所有相关的SO问题都在尝试做更复杂的事情)
您可以使用纯SQL来做到这一点
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value FROM table1 t CROSS JOIN ( SELECT a.N + b.N * 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 n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) ORDER BY value
注意: 诀窍是利用tally(numbers)表和在这种情况下非常方便的MySQL函数SUBSTRING_INDEX()。如果您进行了大量此类查询(拆分),则可以考虑填充并使用持久化计数表,而不是像本例中那样通过子查询动态生成该表。此示例中的子查询有效地生成了一个从1到100的数字序列,使您可以在源表中每行最多拆分100个定界值。如果您需要更多或更少,则可以轻松进行调整。
SUBSTRING_INDEX()
输出:
| 值| | ---------------- | | somethingA | | somethingB | | somethingC | | 其他| | elseElB |
这是 SQLFiddle 演示
这就是查询与持久化理货表格的外观
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value FROM table1 t CROSS JOIN tally n WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) ORDER BY value