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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:45:57