数据库:ORACLE10G字符串(用/分隔的): AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB我想出来结果:AB/CD/EF/GHIJ/KLMN+OP怎么用regexp_replace函数实现呢?

解决方案 »

  1.   

    --regexp_replace估计无法实现,下面的方法可以:
    DECLARE
      STR_IN     VARCHAR2(2000) DEFAULT 'AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB';
      V_STR_TEMP VARCHAR2(2000);
      V_SPLIT    VARCHAR2(1) := '/';
      V_OUT      VARCHAR2(2000) := '';
    BEGIN
      V_STR_TEMP := V_SPLIT || STR_IN || V_SPLIT;
      FOR I IN (SELECT DISTINCT SUBSTR(V_STR_TEMP,
                                       INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM) + 1,
                                       INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM + 1) -
                                       INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM) - 1) BB
                  FROM (SELECT NULL FROM USER_USERS WHERE ROWNUM = 1)
                CONNECT BY ROWNUM <=
                           LENGTH(STR_IN) - LENGTH(REPLACE(STR_IN, V_SPLIT, '')) + 1
                 ORDER BY 1) LOOP
        IF LENGTH(V_OUT) > 0 THEN
          V_OUT := V_OUT || V_SPLIT || I.BB;
        ELSE
          V_OUT := I.BB;
        END IF;
      END LOOP;
      DBMS_OUTPUT.PUT_LINE(V_OUT);
    END;
    /--输出:
    AB/CD/EF/GHIJ/KLMN+OP 
      

  2.   


    SELECT ltrim(REPLACE(wmsys.wm_concat(DISTINCT 
                      regexp_substr('/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB',
                                    '/[^\/]+',1,ROWNUM)),
                   ',/','/'),'/')
    FROM   dual
    CONNECT BY instr('/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB','/',1,ROWNUM) > 0;LTRIM(REPLACE(WMSYS.WM_CONCAT(
    --------------------------------------------------------------------------------
    AB/CD/EF/GHIJ/KLMN+OP
    注意字符串第一个字节必须是/,如果不是,那么加上
      

  3.   

    楼上的能解释一下这里的CONNECT BY与ROWNUM起什么作用吗
      

  4.   

    instr和regexp_substr第四个参数(rownum),表示定位指定的字符串(/)在第几次出现的位置。
    connect by的作用是如果字符串出现N,那么将一条数据(/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB)
    复制成N条数据。
    regexp_substr的作用是第N行数据的值(例如第一行数据是/AB)
    wmsys.wm_concat(DISTINCT 的作用是先去掉重复,再将这几条数据合并成同一个字符串,中间以逗号隔开你可以把那条SQL逐层分解看效果