Oracle中如何去除动态字符串中的连续重复逗号
PL/SQL解决拼接字符串连续重复逗号问题
方法一:使用正则表达式替换(推荐)
利用REGEXP_REPLACE函数一次性将所有连续的逗号替换为单个逗号,同时可处理首尾可能出现的多余逗号:
DECLARE var1 VARCHAR2(100) := 'A_CAL,B_CAL,C_CAL'; var2 VARCHAR2(100) := ''; var3 VARCHAR2(100) := ''; var4 VARCHAR2(100) := 'D_CAL,E_CAL'; var5 VARCHAR2(100) := ''; var6 VARCHAR2(100) := ''; var7 VARCHAR2(100) := ''; var8 VARCHAR2(100) := 'S_CAL'; result VARCHAR2(1000); BEGIN -- 拼接所有变量后替换连续逗号 result := REGEXP_REPLACE( var1 || ',' || var2 || ',' || var3 || ',' || var4 || ',' || var5 || ',' || var6 || ',' || var7 || ',' || var8, ',+', -- 匹配1个或多个连续逗号 ',' -- 替换为单个逗号 ); -- 移除首尾可能存在的逗号 result := TRIM(BOTH ',' FROM result); DBMS_OUTPUT.PUT_LINE(result); END; /
执行后输出:A_CAL,B_CAL,C_CAL,D_CAL,E_CAL,S_CAL
方法二:从根源避免空变量拼接(更稳妥)
先过滤所有空变量,再将非空变量用逗号拼接,从一开始就不产生连续逗号:
DECLARE TYPE varchar2_tab IS TABLE OF VARCHAR2(100); -- 定义字符串集合类型 var1 VARCHAR2(100) := 'A_CAL,B_CAL,C_CAL'; var2 VARCHAR2(100) := ''; var3 VARCHAR2(100) := ''; var4 VARCHAR2(100) := 'D_CAL,E_CAL'; var5 VARCHAR2(100) := ''; var6 VARCHAR2(100) := ''; var7 VARCHAR2(100) := ''; var8 VARCHAR2(100) := 'S_CAL'; v_non_empty_vars varchar2_tab; result VARCHAR2(1000); BEGIN v_non_empty_vars := varchar2_tab(); -- 将非空变量添加到集合 IF var1 IS NOT NULL AND var1 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var1; END IF; IF var2 IS NOT NULL AND var2 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var2; END IF; IF var3 IS NOT NULL AND var3 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var3; END IF; IF var4 IS NOT NULL AND var4 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var4; END IF; IF var5 IS NOT NULL AND var5 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var5; END IF; IF var6 IS NOT NULL AND var6 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var6; END IF; IF var7 IS NOT NULL AND var7 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var7; END IF; IF var8 IS NOT NULL AND var8 <> '' THEN v_non_empty_vars.EXTEND; v_non_empty_vars(v_non_empty_vars.LAST) := var8; END IF; -- 用LISTAGG拼接集合中的非空变量 SELECT LISTAGG(column_value, ',') WITHIN GROUP (ORDER BY ROWNUM) INTO result FROM TABLE(v_non_empty_vars); DBMS_OUTPUT.PUT_LINE(result); END; /
这种方法不会生成多余逗号,适合变量较多或空变量不确定的场景。
方法三:循环替换连续逗号(不推荐)
通过循环调用REPLACE直到字符串中无连续逗号,效率较低,仅适合短字符串临时使用:
DECLARE var1 VARCHAR2(100) := 'A_CAL,B_CAL,C_CAL'; var2 VARCHAR2(100) := ''; var3 VARCHAR2(100) := ''; var4 VARCHAR2(100) := 'D_CAL,E_CAL'; var5 VARCHAR2(100) := ''; var6 VARCHAR2(100) := ''; var7 VARCHAR2(100) := ''; var8 VARCHAR2(100) := 'S_CAL'; result VARCHAR2(1000); BEGIN result := var1 || ',' || var2 || ',' || var3 || ',' || var4 || ',' || var5 || ',' || var6 || ',' || var7 || ',' || var8; -- 循环替换直到无连续逗号 WHILE INSTR(result, ',,') > 0 LOOP result := REPLACE(result, ',,', ','); END LOOP; DBMS_OUTPUT.PUT_LINE(result); END; /
内容的提问来源于stack exchange,提问作者Darshan Salunke
相关产品推荐
相关产品推荐

