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

PL/SQL中如何用正则表达式按出现顺序提取字符串唯一字符

在PL/SQL中按首次出现顺序提取字符串唯一字符

直接使用单一正则表达式(一次REGEXP_REPLACE调用)无法实现这个需求,因为Oracle的正则表达式引擎不支持可变长度反向预查(lookbehind)——而要识别某个字符是否在之前已经出现过,必须依赖这种预查能力回溯已扫描的内容。

不过你可以用以下几种替代方案实现需求:

方案1:使用CONNECT BY与LISTAGG(纯SQL实现)

通过递归遍历字符串的每个字符,结合LISTAGG按顺序聚合首次出现的唯一字符:

WITH input_str AS (SELECT 'abccba' AS str FROM dual)
SELECT LISTAGG(char_val, '') WITHIN GROUP (ORDER BY pos) AS unique_chars
FROM (
    SELECT 
        SUBSTR(str, LEVEL, 1) AS char_val,
        LEVEL AS pos
    FROM input_str
    CONNECT BY LEVEL <= LENGTH(str)
    GROUP BY SUBSTR(str, LEVEL, 1), LEVEL
    ORDER BY pos
);

测试不同输入的结果:

  • 输入'aa' → 返回'a'
  • 输入'ab' → 返回'ab'
  • 输入'aabbcc' → 返回'abc'
  • 输入'abccba' → 返回'abc'

方案2:自定义PL/SQL函数(高效遍历)

如果你更倾向于PL/SQL代码,自定义函数可以高效完成遍历(你提到的多次遍历方式可优化为单次遍历):

CREATE OR REPLACE FUNCTION get_unique_chars(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    v_result VARCHAR2(4000) := '';
    v_char CHAR(1);
BEGIN
    FOR i IN 1..LENGTH(p_str) LOOP
        v_char := SUBSTR(p_str, i, 1);
        IF INSTR(v_result, v_char) = 0 THEN
            v_result := v_result || v_char;
        END IF;
    END LOOP;
    RETURN v_result;
END;
/

-- 调用示例
SELECT get_unique_chars('abccba') FROM dual; -- 返回'abc'

这个函数仅需单次遍历字符串,记录已出现的字符,性能比多次遍历更优。

内容的提问来源于stack exchange,提问作者ctr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:28:10