Oracle SQL:无需使用CONNECT BY子句拆分逗号分隔字符串为行
Oracle 拆分逗号分隔VARCHAR2字符串为多行(不使用CONNECT BY)
以下是几种无需使用CONNECT BY子句的实现方案,适配不同Oracle版本:
方案1:XMLTABLE(Oracle 11gR2+)
利用XMLTABLE函数将字符串转换为XML格式后拆分,是比较简洁的实现方式:
WITH sample_data AS ( SELECT 'AAA,BBB,CCC,DDD' AS input_str FROM dual ) SELECT TRIM(column_value) AS split_str FROM sample_data, XMLTABLE(('"' || REPLACE(input_str, ',', '","') || '"'));
原理说明:
REPLACE(input_str, ',', '","')将原字符串转换为带双引号分隔的格式:"AAA","BBB","CCC","DDD"XMLTABLE会自动将每个双引号包裹的内容拆分为独立行TRIM用于清理子串可能带有的多余空格(如果原字符串包含空格的话)
方案2:递归CTE(Oracle 11g+)
通过递归公共表表达式(CTE)逐次提取子串,避免使用CONNECT BY:
WITH sample_data AS ( SELECT 'AAA,BBB,CCC,DDD' AS input_str FROM dual ), recursive_split AS ( SELECT input_str, 1 AS pos, REGEXP_SUBSTR(input_str, '[^,]+', 1, 1) AS split_str FROM sample_data UNION ALL SELECT input_str, pos + 1, REGEXP_SUBSTR(input_str, '[^,]+', 1, pos + 1) AS split_str FROM recursive_split WHERE REGEXP_SUBSTR(input_str, '[^,]+', 1, pos + 1) IS NOT NULL ) SELECT split_str FROM recursive_split;
原理说明:
- 初始查询提取第一个子串,标记位置为1
- 递归部分每次位置加1,提取对应位置的子串,直到没有子串可提取为止
- 最终筛选出所有拆分后的子串
方案3:JSON_TABLE(Oracle 12c+)
借助Oracle 12c引入的JSON支持,将字符串转换为JSON数组后拆分:
WITH sample_data AS ( SELECT 'AAA,BBB,CCC,DDD' AS input_str FROM dual ) SELECT TRIM(value) AS split_str FROM sample_data, JSON_TABLE(('["' || REPLACE(input_str, ',', '","') || '"]'), '$[*]' COLUMNS value VARCHAR2(100) PATH '$');
原理说明:
- 将原字符串转换为标准JSON数组格式:
["AAA","BBB","CCC","DDD"] JSON_TABLE解析数组,将每个元素映射为单独的行返回
内容的提问来源于stack exchange,提问作者mangesh5171
相关产品推荐
相关产品推荐

