我有一个包含[DEG],[MICRO],[PHASE]等文本的列。 我想用它们在oracle中的符号替换它。 我目前的版本是11g的oracle。 以下链接包含完整的替换列表。
http://i.imgur.com/bl7xvZJ.png
任何帮助都将不胜感激。
答案 0 :(得分:0)
我无法看到你的照片。但是,您可以通过使用Oracle regexp函数(有限)来翻译[DEG]
,[MICRO]
,[PHASE]
的出现次数:
说v_txt
包含您要更改的文字。
declare
v_txt varchar2(4000) := '[]titi;[DEG],[MICRO],[PHASE],[DEG]toto ';
v_key varchar2(100) := '';
v_n number:=0;
begin
for x in (select 'DEG' key, CHR(11*16+0 )val from dual --- DEG UNICODE is B0
union all select 'MICRO' , CHR(11*16+5 ) from dual --- MICRO UNICODE is B5
union all select 'PHASE' , CHR(13*16+14) from dual --- THORN UNICODE is B5
-- 'PHASE' was not found here: http://www.utf8-chartable.de/... I assumed "THORN" letter instead
)
loop
-- check if text contains key:
select count(1) into v_n
from (select v_txt t from dual)
where t like '%['||x.key||']%' ;
while (v_n>0) loop
-- replace key with value in text
select regexp_replace(my_text,'(.*)\['||x.key||'\](.*)' ,'\1'||x.val||'\2')
into v_txt
from (select v_txt my_text from dual);
-- check if key still there
select count(1) into v_n
from (select v_txt t from dual)
where t like '%['||x.key||']%' ;
end loop;
end loop;
dbms_output.put_line(v_txt);
end;
/
我们首先定义一个循环的(key,val)表,对于每对我们使用while循环,只要我们要替换的文本包含键值。
注意:它很容易理解,但它可能不是最有效的方式。
您可以轻松地从上面创建一个功能:
create or replace function f (p_txt varchar2) return varchar2
is
v_txt varchar2(4000) := p_txt;
...
begin
...
return v_txt;
end f;
/
然后在整个专栏中SELECT
:
SELECT f(my_col) FROM MY_TABLE;
希望它有所帮助。