使用 GROUP_CONCAT 函数
MySQL 提供了一个 GROUP_CONCAT 函数,该函数允许大家将多个字段合并为一个字段,并且可以指定分隔符。大家可以使用该函数来将一个字段中的多个数值拆分为多行。
语法如下:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(`column_name`, ',', n), ',', -1) AS `new_column_name`
FROM
`table_name`
WHERE
n<= LENGTH(`column_name`) - LENGTH(REPLACE(`column_name`, ',', '')) + 1
该语句中,大家使用了 SUBSTRING_INDEX 函数来获取逗号分隔的第 n 个值,使用了 LENGTH 函数来计算逗号的个数,从而可以得到拆分后的行数。不过这种方式会占用大量的系统资源,并且可能会降低数据库的性能。
使用 UNION ALL 操作符
除了使用 GROUP_CONCAT 函数,大家也可以使用 UNION ALL 操作符来实现根据逗号拆分为多行的功能。
语法如下:
SELECT
`column_name`
FROM
`table_name`
WHERE
`column_name` NOT LIKE '%,%'
UNION ALL
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(`column_name`, ',', n), ',', -1)
FROM
(SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) n
JOIN
`table_name` ON CHAR_LENGTH(`column_name`) - CHAR_LENGTH(REPLACE(`column_name`, ',', '')) >= n - 1
WHERE
`column_name` LIKE '%,%'
该语句中,大家使用 UNION ALL 操作符将两个 SELECT 语句合并为一个结果集。第一个 SELECT 语句是为了获取不包含逗号的行;第二个 SELECT 语句则是为了获取包含逗号的行,这个语句中大家使用了 UNINO ALL 操作符连接了一个由数字 1 到 4 构成的表和源表。在这个连接之后,大家使用 SUBSTRING_INDEX 函数和 WHERE 子句来对拆分后的行进行过滤。这种方式相对于使用 GROUP_CONCAT 函数,占用的系统资源较少,性能也较高。
通过上述两种方式,大家可以快速地将 MySQL 中的逗号分隔的值拆分为多行。根据实际的业务场景和查询需求,大家可以选择最适合的方式来操作数据库。