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

SQL Server中如何逐字符输出字符串?求更优实现方案

更优的MySQL字符串逐字符拆分方法

你目前用UNION ALL逐个截取字符的方式确实不够灵活——当字符串长度变化时,得手动修改SQL语句,非常麻烦。下面给你两种更优雅的实现方案,适配不同版本的MySQL:

方法一:利用数字辅助表(兼容MySQL 5.x及以上)

我们可以先生成一个足够长的数字序列(比如1到100),然后通过关联这个序列来逐个截取字符串的字符,不用手动写多个UNION ALL:

SELECT SUBSTRING('sas', n, 1) AS single_char
FROM (
    -- 生成1到100的数字序列,可根据需求扩展长度
    SELECT 1 + (a.num * 10 + b.num) AS n
    FROM (SELECT 0 AS num 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
    CROSS JOIN (SELECT 0 AS num 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
) numbers
WHERE n <= LENGTH('sas');

说明:

  • 子查询里的CROSS JOIN生成了0-99的数字,加1后变成1-100,足够覆盖大多数日常字符串长度;如果需要更长的序列,可以再加一层CROSS JOIN扩展范围。
  • WHERE n <= LENGTH('sas')会自动过滤掉超出字符串长度的数字,不管你的字符串是3个字符还是30个字符,都不用修改SQL结构。

方法二:递归CTE(MySQL 8.0及以上版本支持)

如果你的MySQL版本是8.0或更新,递归CTE是最简洁的方案,逻辑清晰且代码量少:

WITH RECURSIVE chars AS (
    -- 初始行:截取第1个字符
    SELECT 1 AS pos, SUBSTRING('sas', 1, 1) AS single_char
    UNION ALL
    -- 递归步骤:每次pos加1,截取下一个字符,直到pos等于字符串长度
    SELECT pos + 1, SUBSTRING('sas', pos + 1, 1)
    FROM chars
    WHERE pos < LENGTH('sas')
)
SELECT single_char FROM chars;

扩展:处理表中的字段

如果不是固定字符串,而是要拆分表中的某个字段(比如表your_table的str_column字段),只需要把固定字符串替换成字段名即可:

数字表版本:

SELECT SUBSTRING(t.str_column, n, 1) AS single_char
FROM your_table t
JOIN (
    SELECT 1 + (a.num * 10 + b.num) AS n
    FROM (SELECT 0 AS num 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
    CROSS JOIN (SELECT 0 AS num 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
) numbers ON n <= LENGTH(t.str_column);

递归CTE版本:

WITH RECURSIVE chars AS (
    SELECT 1 AS pos, SUBSTRING(t.str_column, 1, 1) AS single_char, t.str_column
    FROM your_table t
    UNION ALL
    SELECT pos + 1, SUBSTRING(str_column, pos + 1, 1), str_column
    FROM chars
    WHERE pos < LENGTH(str_column)
)
SELECT single_char FROM chars;

内容的提问来源于stack exchange,提问作者joy08

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:27