在 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 运行环境 🚀



 苏公网安备32021302001419号
苏公网安备32021302001419号