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

SQL实现行内逗号分隔值拆分为多行:百万级数据场景方案咨询

字符串拆分多行的实现方案及大数据量适配

一、各主流数据库的实现代码

1. MySQL(8.0+版本)

利用递归CTE拆分逗号分隔的字符串:

WITH RECURSIVE split_cte AS (
    SELECT 
        Code,
        SUBSTRING_INDEX(Question, ',', 1) AS Question,
        SUBSTRING(Question, LOCATE(',', Question) + 1) AS remaining_questions,
        Score
    FROM Information
    WHERE Question IS NOT NULL AND Question != ''
    UNION ALL
    SELECT 
        Code,
        SUBSTRING_INDEX(remaining_questions, ',', 1) AS Question,
        SUBSTRING(remaining_questions, LOCATE(',', remaining_questions) + 1) AS remaining_questions,
        Score
    FROM split_cte
    WHERE remaining_questions IS NOT NULL AND remaining_questions != ''
)
SELECT Code, Question, Score
FROM split_cte
ORDER BY Code, Question;

2. SQL Server(2016+版本)

使用原生STRING_SPLIT函数配合交叉应用拆分:

SELECT 
    i.Code,
    s.value AS Question,
    i.Score
FROM Information i
CROSS APPLY STRING_SPLIT(i.Question, ',') s
ORDER BY i.Code, s.value;

3. PostgreSQL

通过STRING_TO_ARRAY转数组后用UNNEST展开:

SELECT 
    Code,
    unnest(string_to_array(Question, ',')) AS Question,
    Score
FROM Information
ORDER BY Code, Question;

二、百万级数据场景的可行性及优化建议

  • 可行性:主流数据库的原生拆分函数或优化后的递归逻辑,完全支持百万级数据的拆分处理,但需配合优化手段避免性能瓶颈。
  • 优化方向:
    • 优先使用数据库原生拆分函数(如SQL ServerSTRING_SPLIT、PostgreSQLUNNEST),这类函数经过底层优化,性能远优于自定义递归逻辑。
    • 给Code等常用排序/过滤字段建立索引,降低查询时的排序和检索开销。
    • 若拆分需求为高频操作,建议将拆分结果持久化到新表,定期同步源表数据,避免每次查询都重复拆分。
    • 数据量过大时可按Code维度分批处理,缓解单次操作的CPU、内存负载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:10:16