SQL分裂逗号分隔行[重复]SQL分裂逗号分隔行[重复](SQL split comma separ

2019-05-08 19:47发布

这个问题已经在这里有一个答案:

  • MySQL的:拆分逗号分开成多行 4个回答

我有一个逗号分隔值的变量数列:

somethingA,somethingB,somethingC
somethingElseA, somethingElseB

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

somethingA
somethingB
somethingC
somethingElseA
somethingElseB

我怎样才能在SQL(MySQL的)这样做呢?

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

Answer 1:

你可以用这样的纯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演示



文章来源: SQL split comma separated row [duplicate]
标签: mysql sql hive