You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:55:39