请教一个问题:比如有一个字符串,v_str := 'aBcX234EfX789uyTr'
是否能通过oracle自带的一个函数或者函数组合,从字符串中抽取出“X数字”的所有匹配,并用逗号连接起来,即
function(v_str) = 'X234,X789'
是否 regexp_ 相关函数能做到?

解决方案 »

  1.   

    可以!我说一下我的想法吧。REGEXP_SUBSTR和正则表达式。里面第四个参数是标识第几个匹配组。(默认为1)。
    采用循环,i++,把匹配的数取出来再拼上就可以了。
      

  2.   


    SQL> set serveroutput on;
    SQL> declare
      2   v_str varchar(100) := 'aBcX234EfX789uyTr';
      3  begin
      4   dbms_output.put_line(
      5   regexp_replace(
      6   regexp_replace(regexp_replace(replace(v_str,'X','aX'),'[^X0-9]',','),',{2,}',',')
      7   ,'^,|,$','')
      8   );
      9  end;
     10  /
    X234,X789                                                                       PL/SQL 过程已成功完成。
      

  3.   

    楼上的做法有点小瑕疵,
    aBcX234EfX789uyTXr56 这样的字符串会输出X234,X789,X,56好吧,写个循环
    declare
      l_str varchar2(128) := 'aBcX234EfX789uyTXr56';
      l_substr varchar2(128);
      l_result varchar2(128);
      l_occurrence int := 1;
    begin
      loop
        select regexp_substr(l_str, 'X[0-9]+', 1, l_occurrence) into l_substr from dual;
        exit when l_substr is null;
        if (l_occurrence <> 1) then
          l_result := l_result || ',';
        end if;
        l_result := l_result || l_substr;
        l_occurrence := l_occurrence + 1;
      end loop;
      dbms_output.put_line(l_result);
    end;
      

  4.   

    regexp_substr的第三个参数表示查找起始位置。
    第四个参数表示如果找到多个子串,返回第几个子串,利用这个参数,循环查找就行。
      

  5.   


    --发现问题是好事情,哥们,再去试,呵呵
    SQL> declare
      2   v_str varchar(100) := 'aBcX234EfX789uyTrXr56';
      3  begin
      4   dbms_output.put_line(
      5   regexp_replace(
      6   regexp_replace(regexp_replace(replace(v_str,'X','aX'),
      7   '[A-WYZa-z]{1}[0-9]+|[^X0-9]|^[0-9]+',','),',{2,}',',')
      8   ,'^,|,$|,?X+[^0-9]','')
      9   );
     10  end;
     11  /
    X234,X789                                                                       已順利完成 PL/SQL 程序.