有一字符串格式为 "境制出,;制出ABCDEFG;&;制出0910111"
境是一个中文汉字,在oracle 需要将 &#x及后面的;去掉,如以下语句,进行转换
select utl_raw.cast_to_nvarchar2('5883') from dual转换方法是utl_raw.cast_to_nvarchar2
如何以最快速度得到 结果为: "境制出,制出ABCDEFG;&;制出0910111"
境是一个中文汉字,在oracle 需要将 &#x及后面的;去掉,如以下语句,进行转换
select utl_raw.cast_to_nvarchar2('5883') from dual转换方法是utl_raw.cast_to_nvarchar2
如何以最快速度得到 结果为: "境制出,制出ABCDEFG;&;制出0910111"
解决方案 »
- oracle 表导出 sql 怎么写?
- 一个动态SQL里,如何写多个update语句
- 没辙了 看看这sql 怎么优化 给个意见
- Oracle问题--关于select * from sys.col
- 请问在PROC中使用游标后,是先提交事务,还是先关闭游标?智者见智贴!无分了!
- 我有几个表,但是不知道他们之间的关联关系,怎么删除表的记录而不出错
- 刚装10g,被一个简单的问题难住了!
- 上哪下载 Oracle Provider For OLE DB?
- 用jdbc连数据库取出汉字,怎显示不出来
- 安装oracle 11G先决条件检查有错误
- weblogic提示ora-01012错误
- 关于建表冗余的讨论(性能的影响)
方案一
plsql使用循环进行截取转换拼接得到结果.
方案二
使用sql做截取转换.会用到connect by,截取,列转行,wm_concat聚合感觉方案一会快点.
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>
谢谢 在水一方 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 就会出错.
看看还有什么好的方法.
-- 先用一个if 语句 判断一下,就OK啦!
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;
没找到好的方法,还是使用逐个替换了
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;
结贴