纯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
相关产品推荐
相关产品推荐

