Oracle 中,可以使用多种方式分割字符串,常见的方法包括:

1. 使用 REGEXP_SUBSTR

适用于按 特定分隔符 分割字符串:

SELECT REGEXP_SUBSTR('apple,banana,grape', '[^,]+', 1, 1) AS part1,
       REGEXP_SUBSTR('apple,banana,grape', '[^,]+', 1, 2) AS part2,
       REGEXP_SUBSTR('apple,banana,grape', '[^,]+', 1, 3) AS part3
FROM dual;

解释:

  • [^,]+ 匹配 非逗号 的所有字符
  • 1, 1/2/3 表示提取第 1/2/3 个匹配项

2. 使用 REGEXP_COUNT + REGEXP_SUBSTR 动态拆分

适用于 字符串长度和数量不固定 的情况:

WITH str AS (
    SELECT 'apple,banana,grape' AS text FROM dual
),
numbers AS (
    SELECT LEVEL AS n FROM dual
    CONNECT BY LEVEL <= (SELECT REGEXP_COUNT(text, ',') + 1 FROM str)
)
SELECT REGEXP_SUBSTR(text, '[^,]+', 1, n) AS part
FROM str, numbers;

解释:

  • REGEXP_COUNT(text, ',') + 1 计算 分隔符+1 的数量(即子字符串个数)
  • 递归 CONNECT BY LEVEL 生成 序号,配合 REGEXP_SUBSTR 动态提取

3. 使用 SPLIT 模拟函数(PL/SQL 版)

适用于 存储过程批量处理

CREATE OR REPLACE FUNCTION split_string(p_str VARCHAR2, p_delim VARCHAR2)
RETURN SYS.ODCIVARCHAR2LIST PIPELINED AS
    v_start NUMBER := 1;
    v_end NUMBER;
    v_substr VARCHAR2(4000);
BEGIN
    LOOP
        v_end := INSTR(p_str, p_delim, v_start);
        IF v_end = 0 THEN
            PIPE ROW (SUBSTR(p_str, v_start));
            EXIT;
        END IF;
        PIPE ROW (SUBSTR(p_str, v_start, v_end - v_start));
        v_start := v_end + LENGTH(p_delim);
    END LOOP;
    RETURN;
END;

调用示例:

SELECT COLUMN_VALUE FROM TABLE(split_string('apple,banana,grape', ','));

输出:

COLUMN_VALUE
------------
apple
banana
grape

总结:

  • 简单拆分REGEXP_SUBSTR
  • 动态拆分REGEXP_COUNT + CONNECT BY
  • 批量处理:PL/SQL 自定义函数

哪种方法适合,取决于你的业务需求和 SQL 运行环境 🚀