有一字符串格式为 "境制出,;制出ABCDEFG;&;制出0910111"
境是一个中文汉字,在oracle 需要将 &#x及后面的;去掉,如以下语句,进行转换 
select utl_raw.cast_to_nvarchar2('5883') from dual转换方法是utl_raw.cast_to_nvarchar2
如何以最快速度得到 结果为: "境制出,制出ABCDEFG;&;制出0910111"

解决方案 »

  1.   

    最快难倒我了.
    方案一
    plsql使用循环进行截取转换拼接得到结果.
    方案二
    使用sql做截取转换.会用到connect by,截取,列转行,wm_concat聚合感觉方案一会快点.
      

  2.   


    SQL> 
    SQL> with tab as
      2  (
      3    select '\&\#x5883;\&\#x5236;\&\#x51FA;,;\&\#x5236;\&\#x51FA;ABCDEFG;\&;\&\#x5236;\&\#x51FA;0910111' col from dual
      4  )
      5  select replace(wm_concat(ac),'\','')
      6  from (select decode(regexp_replace(aliscol, '\\&\\#x', ''),
      7                aliscol,
      8                aliscol,
      9                utl_raw.cast_to_nvarchar2(translate(aliscol,'a-zA-Z0-9\&\#x','a-zA-Z0-9'))) ac
     10    from (select regexp_substr(col, '[^;]+', 1, rownum) aliscol
     11            from tab
     12          connect by rownum <= 10) a)
     13  ;REPLACE(WM_CONCAT(AC),'\','')
    --------------------------------------------------------------------------------
    境,制,出,,,制,出,ABCDEFG,&,制,出SQL> 
      

  3.   

    select unistr(REPLACE(REPLACE('&#x5883;&#x5236;&#x51FA;,;&#x5236;&#x51FA;ABCDEFG;&;&#x5236;&#x51FA;0910111',';&#x','\'),'&#x','\')) from dual;
      

  4.   

    忘记说环境了是oracle 9i
    谢谢 在水一方 Oraclefans_ luoyoumou!!Oraclefans_的方法中 regexp_substr的在10g才有.luoyoumou的方法,我也试用过,如果是在全部是汉字的情况下替换是没问题的,但如果中间夹有符号或数字字符就会出错.
    例如: 
    select utl_raw.cast_to_nvarchar2('5883523651FA')  from dual 结果为 "境制出"
    但如果 中间或尾部夹有例如z select utl_raw.cast_to_nvarchar2('5883523651FAz')  from dual 就会出错.
    看看还有什么好的方法.
      

  5.   


    -- 先用一个if 语句 判断一下,就OK啦!
      

  6.   

      IF v_sxml like '%&#x%' THEN
        v_sxml2 := unistr(REPLACE(REPLACE(REPLACE(v_sxml,';&#x','\'),'&#x','\'),';<','<'));
      ELSE
        v_sxml2 := v_sxml;
      END IF;-- 写成SQL语句:
    select if(column_name like '%&#x%' then ... else ... end) from dual;
      

  7.   

    谢谢各位.
    没找到好的方法,还是使用逐个替换了
    while i<=length(utfstr) loop
          if substr(utfstr,i,3)='&#x' and substr(utfstr,i+7,1)=';' then
           resultstr:=resultstr||utl_raw.cast_to_nvarchar2(substr(utfstr,i+3,4));
           i:=i+8;
          else
           resultstr:=resultstr||substr(utfstr,i,1);
           i:=i+1;
          end if;        
         end loop;
    结贴