如何在MySQL中将逗号分隔字符串转换为表结果?
在MySQL中将逗号分隔字符串转为带序号的表
作为从SQL Server转过来的用户,我完全懂这种功能转换的痛点!针对你给出的字符串'45,55,65,41',下面提供几种在MySQL里实现将其转换为包含id(序号)和value列的表的方法:
方法1:使用递归CTE(MySQL 8.0+ 推荐)
MySQL 8.0及以上版本支持递归公共表表达式(CTE),这是最简洁直观的方式:
WITH RECURSIVE split_strings AS ( SELECT 1 AS id, SUBSTRING_INDEX('45,55,65,41', ',', 1) AS value, SUBSTRING('45,55,65,41', LENGTH(SUBSTRING_INDEX('45,55,65,41', ',', 1)) + 2) AS remaining_str UNION ALL SELECT id + 1, SUBSTRING_INDEX(remaining_str, ',', 1), SUBSTRING(remaining_str, LENGTH(SUBSTRING_INDEX(remaining_str, ',', 1)) + 2) FROM split_strings WHERE remaining_str != '' ) SELECT id, value FROM split_strings;
执行后你会得到如下结果:
+----+-------+ | id | value | +----+-------+ | 1 | 45 | | 2 | 55 | | 3 | 65 | | 4 | 41 | +----+-------+
方法2:适用于MySQL 5.x版本(无递归CTE支持)
如果你的MySQL版本低于8.0,可以借助系统表生成临时行,再拆分字符串:
SELECT @row := @row + 1 AS id, SUBSTRING_INDEX(SUBSTRING_INDEX('45,55,65,41', ',', @row), ',', -1) AS value FROM information_schema.tables, (SELECT @row := 0) AS init WHERE @row < LENGTH('45,55,65,41') - LENGTH(REPLACE('45,55,65,41', ',', '')) + 1;
这个方法利用information_schema.tables的行数来生成足够的序号(如果字符串拆分后的元素数量超过表行数,可能需要换更大的系统表或者自定义数字表),执行结果和上面一致。
补充说明
- 两种方法都能自动根据逗号分隔的元素数量生成对应的
id序号,不需要手动指定数量 - 如果字符串里可能存在空值(比如连续逗号),可以在查询里加
WHERE value != ''来过滤空行
内容的提问来源于stack exchange,提问作者55SK55
相关产品推荐
相关产品推荐

