从另一个表oracle中提取并替换值

时间:2015-04-06 09:34:50

标签: oracle replace extract

我有一个从列中检索的值。典型值如下所示

1 \ 1 \ 1 \ 1 \ 4 \ 1 \ 99 \ 610000102 \ 2 \ 6 \ 0 \ 4 \ 6 \ 50 \ 536870969 \ 2 \ 0 \ 4 \ 1 \ 99 \ 610000103 \ 2 \ 6 \ 0 \ 4 \ 6 \ 51 \ 536870969 \ 2 \ 4 \ 7 \ SUSPEND \ 4 \ 2 \ 99 \ 536871469 \ 2 \ 2 \ 0 \

我需要替换以粗体突出显示的数字。数字的实际值将保存在另一个表中。例如,需要从另一个表中查询第一个粗体数字 610000102 ,说明 从表格中选择值,其中数字=&#39; 610000102&#39; < / strong>并且值必须替换为

1 \ 1 \ 1 \ 1 \ 4 \ 1 \ 99 \ value1 \ 2 \ 6 \ 0 \ 4 \ 6 \ 50 \ value2 \ 2 \ 0 \ 4 \ 1 \ 99 \ value3 \ 2 \ 6 \ 0 \ 4 \ 6 \ 51 \ value4 \ 2 \ 4 \ 7 \ SUSPEND \ 4 \ 2 \ 99 \ value5 \ 2 \ 2 \ 0 \

以下是粗体数字的行为

  1. 其中的位数不固定
  2. 粗体数字左侧或右侧的字符/数字不是 修复
  3. 粗体数可以是n,所有都需要替换 与其他表中的对应值
  4. 数字将始终位于&#34; \ \&#34;
  5. 请帮助提出解决方案

    此致 Naveen S

1 个答案:

答案 0 :(得分:0)

首先查询:

with t as 
     (select '1\1\1\1\4\1\99\610000102\2\6\0\4\6\50\536870969\' str from dual)
 select regexp_substr(t.str, '[^\]+', 1, level) n
   from source_table t
connect by regexp_substr(t.str, '[^\]+', 1, level) is not null;

此查询将字符串分解为数字:

n
-
1
1
1
1
4
1
...

之后,使用表连接此查询,该表包含替换值。假设它仅包含数字610000102536870969等的值(仅适用于必须替换的数字)。使用分隔符\(在oracle 11.2或更高版本中工作)将聚集号码连接到一个字符串中后:

with t as 
     (select '1\1\1\1\4\1\99\610000102\2\6\0\4\6\50\536870969\ ' str from dual)
select listagg(nvl(t2.value, nums.n), '\') within group (order by nums.l)
  from (select regexp_substr(t.str, '[^\]+', 1, level) n, level l
          from t
       connect by regexp_substr(t.str, '[^\]+', 1, level) is not null) nums
        left join table2 t2 on nums.n = t2.number;