oracle 字符串替换优化问题

lbd8848 2011-02-09 09:46:53
有一字符串格式为 "境制出,;制出ABCDEFG;&;制出0910111"
境是一个中文汉字,在oracle 需要将 &#x及后面的;去掉,如以下语句,进行转换
select utl_raw.cast_to_nvarchar2('5883') from dual

转换方法是utl_raw.cast_to_nvarchar2


如何以最快速度得到 结果为: "境制出,制出ABCDEFG;&;制出0910111"




...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2011-02-09
  • 打赏
  • 举报
回复
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;
luoyoumou 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lbd8848 的回复:]

忘记说环境了是oracle 9i
谢谢 在水一方 Oraclefans_ luoyoumou!!

Oraclefans_的方法中 regexp_substr的在10g才有.

luoyoumou的方法,我也试用过,如果是在全部是汉字的情况下替换是没问题的,但如果中间夹有符号或数字字符就会出错.
例如:
select utl_raw.cast_to_nvarchar2('5883……
[/Quote]

-- 先用一个if 语句 判断一下,就OK啦!
lbd8848 2011-02-09
  • 打赏
  • 举报
回复
忘记说环境了是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 就会出错.
看看还有什么好的方法.
minitoy 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luoyoumou 的回复:]
SQL code
select unistr(REPLACE(REPLACE('&#x5883;&#x5236;&#x51FA;,;&#x5236;&#x51FA;ABCDEFG;&;&#x5236;&#x51FA;0910111',';&#x','\'),'&#x','\')) from dual;
[/Quote]
luoyoumou 2011-02-09
  • 打赏
  • 举报
回复
select unistr(REPLACE(REPLACE('境制出,;制出ABCDEFG;&;制出0910111',';&#x','\'),'&#x','\')) from dual;
Oraclefans_ 2011-02-09
  • 打赏
  • 举报
回复

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>
minitoy 2011-02-09
  • 打赏
  • 举报
回复
最快难倒我了.
方案一
plsql使用循环进行截取转换拼接得到结果.
方案二
使用sql做截取转换.会用到connect by,截取,列转行,wm_concat聚合

感觉方案一会快点.
lbd8848 2011-02-09
  • 打赏
  • 举报
回复
谢谢各位.
没找到好的方法,还是使用逐个替换了
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;
结贴

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧