您可以像这样使用纯 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 个分隔值。如果您需要更多或更少,您可以轻松调整它。
输出:
| 价值 |
|----------------|
| 某事A |
| 某事B |
| 某事C |
| 别的东西A |
| 别的东西B |
这是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演示