我有一个逗号分隔值的变量数列:
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
注:关键是要充分利用理货(数字)表和一个非常方便的在这种情况下,MySQL的功能SUBSTRING_INDEX()
如果你做了很多这样的查询(分裂),那么你可以考虑来填充和使用持久符合表而不是使用子查询生成它飞就像这个例子的。 此示例中的子查询生成从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演示