Oracle APEX中PL/SQL检测字符串重复分隔字符的问题求助
解决Oracle APEX中检测逗号分隔字符串重复项的问题
你的现有代码无法检测到重复项,核心原因是正则表达式(P{2,}?|C{2,}?|W{2,}?|T{2,}?)仅匹配连续出现2次及以上的相同字符,但你的场景是逗号分隔的独立值重复(比如P,T,P,C里的P被逗号隔开),完全不适用。
以下是两种可行的解决方案:
方法一:使用正则表达式匹配非连续重复值
通过捕获分组匹配任意目标代码,再检测其是否在字符串后续位置重复出现:
DECLARE v_seccode varchar2(10) := 'P,T,P,C'; BEGIN -- 匹配P/C/T/W中任意一个代码重复出现的情况 if regexp_like(v_seccode, '([PCTW]),.*\1') then raise_application_error(-20001,'不能重复列出相同的SEC代码!'); end if; END; /
- 正则说明:
([PCTW])捕获一个目标SEC代码,,.*\1表示后续出现逗号、任意内容后再次出现该捕获的代码。 - 如果需要忽略大小写,可在
regexp_like第三个参数添加'i',即regexp_like(v_seccode, '([PCTW]),.*\1', 'i')。
方法二:拆分字符串统计重复项(更通用可靠)
如果SEC代码可能是多字符、分隔符有变化,拆分字符串后统计每个代码的出现次数是更稳妥的方式:
DECLARE v_seccode varchar2(10) := 'P,T,P,C'; v_dup_count number; BEGIN -- 拆分逗号分隔的字符串为单行数据,统计重复项数量 select count(*) into v_dup_count from ( select regexp_substr(v_seccode, '[^,]+', 1, level) as sec_code from dual connect by regexp_substr(v_seccode, '[^,]+', 1, level) is not null ) group by sec_code having count(*) > 1; -- 存在重复项则触发错误 if v_dup_count > 0 then raise_application_error(-20001,'不能重复列出相同的SEC代码!'); end if; END; /
- 逻辑说明:用
regexp_substr结合connect by拆分字符串为多行,分组后统计每个代码的出现次数,只要有出现次数大于1的项,就触发错误提示。
内容的提问来源于stack exchange,提问作者LogicallyFunky
相关产品推荐
相关产品推荐

