将列数据中的[DEGREE]替换为oracle中的符号

时间:2016-05-02 05:27:02

标签: oracle extended-ascii

我有一个包含[DEG],[MICRO],[PHASE]等文本的列。 我想用它们在oracle中的符号替换它。 我目前的版本是11g的oracle。 以下链接包含完整的替换列表。

http://i.imgur.com/bl7xvZJ.png

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我无法看到你的照片。但是,您可以通过使用Oracle 函数(有限)来翻译[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;

希望它有所帮助。