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

纯SQL实现拆分逗号分隔列值为多行插入生成目标结果表

解答

完全可以通过纯SQL实现该需求,无需依赖存储过程、外部脚本等额外能力。

实现逻辑

整个实现分为两个核心步骤:

  • 对临时表中逗号分隔存储的Type字段做拆分,将一行存储的多值转换为多行单值,拆分过程注意去除值前后的多余空格
  • 将拆分后的临时表结果与源表做关联,匹配得到对应的Text字段,组装为最终结果集

示例代码

先约定测试表结构与数据,和你描述的场景一致:

  • 临时表temp_table(字段:ID、Code、Type)共3条数据,Type为逗号分隔多值
  • 源表source_table(字段:ID、Code、Text)共3条数据
  • 最终输出字段为ID、Code、Text、Type,共6条记录

兼容多数数据库的通用写法(递归CTE实现,支持MySQL 8.0+、PostgreSQL 12+、SQL Server 2017+等主流数据库版本)

WITH RECURSIVE type_split AS (
    -- 递归起始:提取每条记录的第一个Type值
    SELECT
        ID,
        Code,
        TRIM(SUBSTRING_INDEX(TRIM(Type), ',', 1)) AS single_type,
        SUBSTRING(TRIM(Type), LENGTH(SUBSTRING_INDEX(TRIM(Type), ',', 1)) + 2) AS remain_content
    FROM temp_table
    UNION ALL
    -- 递归迭代:逐次提取剩余内容中的Type值
    SELECT
        ID,
        Code,
        TRIM(SUBSTRING_INDEX(remain_content, ',', 1)) AS single_type,
        SUBSTRING(remain_content, LENGTH(SUBSTRING_INDEX(remain_content, ',', 1)) + 2) AS remain_content
    FROM type_split
    WHERE remain_content IS NOT NULL AND remain_content != ''
)
-- 关联源表组装最终结果
SELECT
    t.ID,
    t.Code,
    s.Text,
    t.single_type AS Type
FROM type_split t
INNER JOIN source_table s
-- 关联条件可根据实际业务规则调整,默认按两表共有的Code字段关联
ON t.Code = s.Code
ORDER BY t.ID, t.single_type;

各数据库简化写法

如果你的数据库版本支持内置字符串拆分函数,可以用更简洁的写法实现:

  • PostgreSQL:利用数组拆分函数string_to_array和unnest实现行转列
SELECT
    t.ID,
    t.Code,
    s.Text,
    TRIM(unnest(string_to_array(TRIM(t.Type), ','))) AS Type
FROM temp_table t
INNER JOIN source_table s ON t.Code = s.Code;
  • SQL Server:利用STRING_SPLIT表值函数拆分
SELECT
    t.ID,
    t.Code,
    s.Text,
    TRIM(v.value) AS Type
FROM temp_table t
CROSS APPLY STRING_SPLIT(TRIM(t.Type), ',') v
INNER JOIN source_table s ON t.Code = s.Code;
  • MySQL 8.0.20+:利用JSON_TABLE拆分
SELECT
    t.ID,
    t.Code,
    s.Text,
    TRIM(j.single_type) AS Type
FROM temp_table t
JOIN JSON_TABLE(
    CONCAT('["', REPLACE(TRIM(t.Type), ',', '","'), '"]'),
    '$[*]' COLUMNS (single_type VARCHAR(20) PATH '$')
) j
INNER JOIN source_table s ON t.Code = s.Code;

注意事项

  • 由于你的Type字段是char(20)定长类型,存储时会自动在尾部补空格,拆分前建议先对Type字段做TRIM()处理,避免生成空的无效行
  • 逗号分隔值拆分后必须用TRIM()处理单值,避免逗号后的空格导致关联匹配失败(比如示例值A, B直接拆分得到的第二个值是 B,前置空格会导致关联不命中)
  • 如果你的业务关联逻辑不是通过Code字段匹配,只需要调整最终关联的ON条件即可,拆分逻辑不需要改动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:48:21