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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:13:11