2013-09-29 272 views
19

SQL分裂我有逗号分隔值的变量数列:逗号分隔

somethingA,somethingB,somethingC 
somethingElseA, somethingElseB 

而且我想要的结果采取的每个值,并创建一个行:

somethingA 
somethingB 
somethingC 
somethingElseA 
somethingElseB 

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

(我试着用搜索引擎“内爆”和“横向视图”,但这些似乎并没有露面相关问题。所有相关的SO问题,正在努力做更多复杂的事情)

+0

问了一个gazillion倍的SO:eghttp://stackoverflow.com/questions/10581772/sql-server-2008-how-to-split-a-comma-separated-value-to-columns ,http://stackoverflow.com/questions/13873701/convert-comma-separated-column-value-to-rows –

+1

@MitchWheat - 那不是这个问题的答案。他们有一定数量的逗号分隔值,我不知道。 –

+0

您正在寻找纯粹的SQL解决方案还是其他语言的解决方案 - 例如PHP。 – 2013-09-29 01:31:44

回答

59

你可以用纯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 

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

输出:

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

这里是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 

这里是SQLFiddle demo

+1

天才解决方案。谢谢。 – bharatesh

+0

很好的答案,完美地将朋友ID插入用户关系表(基于包含friendid1的列,friendid2) –

+0

Works。提示:替换'table1 - > [你的表]','values - >你的字段名','value - >你的字段名',不需要其他东西。 –