【问题标题】:Replace [DEGREE] in column data with its symbol in oracle将列数据中的 [DEGREE] 替换为其在 oracle 中的符号
【发布时间】:2016-05-02 05:27:01
【问题描述】:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 你的数据库字符集是什么?
  • NLS_CHARACTERSET - AL32UTF8

标签: oracle extended-ascii


【解决方案1】:

我看不到你的图片。但是,您可以使用 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;

希望对你有帮助。

【讨论】:

  • 你可以使用unistr('\00b5')函数代替CHR(11*16+5 )
  • 我使用了 unistr('\00b5') 并且效果很好。谢谢
猜你喜欢
  • 2016-09-14
  • 2018-03-06
  • 2013-04-09
  • 2018-06-18
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2021-09-19
  • 2021-06-14
相关资源
最近更新 更多