You need to enable JavaScript to run this app. 如何将SQL表中字符串列拆分为单字符对应的多行数据
优惠活动
大模型
产品
解决方案
定价
更多

如何将SQL表中字符串列拆分为单字符对应的多行数据

单字符拆分SQL实现方案

核心思路是绕过STRING_SPLIT无分隔符拆分的限制,通过生成和字符串长度匹配的连续数字序列,逐个截取对应位置的字符实现拆分。

适配SQL Server实现(你提到的STRING_SPLIT为SQL Server内置函数)

WITH RECURSIVE num_seq AS (
    -- 生成连续数字序列,起始值为1
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM num_seq 
    WHERE n <= (SELECT MAX(LEN(value)) FROM your_table)
)
SELECT 
    ROW_NUMBER() OVER(ORDER BY t.id, ns.n) AS id,
    SUBSTRING(t.value, ns.n, 1) AS value
FROM your_table t
INNER JOIN num_seq ns 
    ON ns.n <= LEN(t.value)
ORDER BY id
-- 若字符串长度超过100,需加下面的配置解除递归深度限制
-- OPTION (MAXRECURSION 0)

将代码中的your_table替换为你的实际表名即可运行。如果处理的字符串长度固定较短,也可以用更简单的硬编码写法:

SELECT 1 AS id, SUBSTRING(value,1,1) AS value FROM your_table
UNION ALL
SELECT 2 AS id, SUBSTRING(value,2,1) AS value FROM your_table
UNION ALL
SELECT 3 AS id, SUBSTRING(value,3,1) AS value FROM your_table
UNION ALL
SELECT 4 AS id, SUBSTRING(value,4,1) AS value FROM your_table

其他常用数据库实现参考

MySQL

WITH RECURSIVE num_seq AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM num_seq 
    WHERE n <= (SELECT MAX(CHAR_LENGTH(value)) FROM your_table)
)
SELECT 
    ROW_NUMBER() OVER(ORDER BY t.id, ns.n) AS id,
    SUBSTRING(t.value, ns.n, 1) AS value
FROM your_table t
INNER JOIN num_seq ns ON ns.n <= CHAR_LENGTH(t.value)
ORDER BY id;

PostgreSQL

SELECT 
    ROW_NUMBER() OVER(ORDER BY t.id, gs.n) AS id,
    SUBSTRING(t.value, gs.n, 1) AS value
FROM your_table t
INNER JOIN generate_series(1, (SELECT MAX(LENGTH(value)) FROM your_table)) gs(n) 
    ON gs.n <= LENGTH(t.value)
ORDER BY id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 22:45:03