MySQL中根据分隔符列转行是一种非常实用的技术,它可以将一列中包含多个值的数据转换成多行单一值的形式。下面是一个示例:
CREATE TABLE t (id INT, names TEXT);INSERT INTO t (id, names) VALUES (1, 'Tom,Dick,Harry');INSERT INTO t (id, names) VALUES (2, 'Mary,Lucy');SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(names, ',', n), ',', -1) AS nameFROM tJOIN (SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) nsWHERE n<= 1 + LENGTH(names) - LENGTH(REPLACE(names, ',', ''));
上面的代码将t表中的names列根据逗号分隔符转换成多行单一值的形式。其中,SUBSTRING_INDEX函数用于分隔字符串,JOIN子句和UNION语句用于生成n值的序列,WHERE子句用于限制n的取值范围。
需要注意的是,上面的代码中使用了UNION语句生成n值的序列,如果n的取值范围过大,那么效率会比较低。为了提高效率,我们可以使用MySQL 8.0以上版本中的WITH RECURSIVE子句来生成n值的序列:
WITH RECURSIVE ns AS (SELECT 1 nUNION ALLSELECT n + 1 FROM ns WHERE n< 10)SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(names, ',', n), ',', -1) AS nameFROM tJOIN ns ON n<= 1 + LENGTH(names) - LENGTH(REPLACE(names, ',', ''));
上面的代码使用了WITH RECURSIVE子句生成n值的序列,如果n的取值范围发生了变化,只需要修改第二行的条件即可。这样既提高了效率,又方便了代码的维护。