你可以用纯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
问了一个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 –
@MitchWheat - 那不是这个问题的答案。他们有一定数量的逗号分隔值,我不知道。 –
您正在寻找纯粹的SQL解决方案还是其他语言的解决方案 - 例如PHP。 – 2013-09-29 01:31:44