一尘不染

SQL分割逗号分隔行[重复]

mysql

这个问题已经在这里有了答案

MySQL:将逗号分隔的列表分成多行 (4个答案)

6年前关闭。

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

somethingA,somethingB,somethingC
somethingElseA, somethingElseB

我希望结果采用每个值,并创建一行:

somethingA
somethingB
somethingC
somethingElseA
somethingElseB

如何在SQL(MySQL)中执行此操作?

(我曾尝试使用谷歌搜索“内爆”和“侧面视图”,但是这些似乎并没有出现相关问题。所有相关的SO问题都在尝试做更复杂的事情)


阅读 286

收藏
2020-05-17

共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

注意:
诀窍是利用tally(numbers)表和在这种情况下非常方便的MySQL函数SUBSTRING_INDEX()。如果您进行了大量此类查询(拆分),则可以考虑填充并使用持久化计数表,而不是像本例中那样通过子查询动态生成该表。此示例中的子查询有效地生成了一个从1到100的数字序列,使您可以在源表中每行最多拆分100个定界值。如果您需要更多或更少,则可以轻松进行调整。

输出:

| 值|
| ---------------- |
| 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

这是 SQLFiddle 演示

2020-05-17