如何在SQL SELECT命令中拆分表内逗号分隔的字符串列为多行结果?
逗号分隔字符串拆分为多行的实现方案
不同SQL引擎没有统一的原生字符串拆分函数标准,需要根据实际使用的数据库匹配对应实现逻辑,以下是主流数据库的实现方式,均可基于示例表输出目标单列结果集。
MySQL 8.0+ 实现
方案1:递归CTE拆分(兼容所有8.0以上版本)
WITH RECURSIVE split_helper AS ( SELECT id, SUBSTRING_INDEX(strColumn, ',', 1) AS newColumn, CASE WHEN LOCATE(',', strColumn) > 0 THEN SUBSTRING(strColumn, LOCATE(',', strColumn) + 1) ELSE NULL END AS remain_str FROM test_table UNION ALL SELECT id, SUBSTRING_INDEX(remain_str, ',', 1), CASE WHEN LOCATE(',', remain_str) > 0 THEN SUBSTRING(remain_str, LOCATE(',', remain_str) + 1) ELSE NULL END FROM split_helper WHERE remain_str IS NOT NULL ) SELECT newColumn FROM split_helper;
方案2:JSON_TABLE快速拆分(适配8.0.17及以上版本,语法更简洁)
SELECT jt.newColumn FROM test_table t, JSON_TABLE( CONCAT('["', REPLACE(t.strColumn, ',', '","'), '"]'), '$[*]' COLUMNS (newColumn VARCHAR(100) PATH '$') ) AS jt;
PostgreSQL 实现
直接调用内置的字符串拆分函数即可:
SELECT regexp_split_to_table(strColumn, ',') AS newColumn FROM test_table;
SQL Server 2016+ 实现
使用内置的STRING_SPLIT函数配合交叉应用完成拆分:
SELECT value AS newColumn FROM test_table CROSS APPLY STRING_SPLIT(strColumn, ',');
Oracle 实现
12c及以上版本
通过JSON_TABLE直接拆分:
SELECT newColumn FROM test_table, JSON_TABLE( '"' || REPLACE(strColumn, ',', '","') || '"', '$[*]' COLUMNS (newColumn VARCHAR2(100) PATH '$') );
11g版本兼容实现
通过正则匹配配合层级查询拆分:
SELECT REGEXP_SUBSTR(strColumn, '[^,]+', 1, LEVEL) AS newColumn FROM test_table CONNECT BY LEVEL <= REGEXP_COUNT(strColumn, ',') + 1 AND PRIOR id = id AND PRIOR SYS_GUID() IS NOT NULL;
通用注意事项
- 如果原字符串存在连续逗号、首尾带逗号的场景,部分引擎会生成空字符串值,可按需追加过滤条件排除无意义空值,例如在查询末尾添加
WHERE newColumn != ''。 - 如果原字符串的分隔符前后存在多余空格,可在拆分结果外层套
TRIM()函数清理文本,避免残留无效空格。
内容的提问来源于stack exchange,提问作者user3779883
相关产品推荐
相关产品推荐

