我有一个从列中检索的值。典型值如下所示
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 \
以下是粗体数字的行为
请帮助提出解决方案
此致 Naveen S
答案 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
...
之后,使用表连接此查询,该表包含替换值。假设它仅包含数字610000102
,536870969
等的值(仅适用于必须替换的数字)。使用分隔符\
(在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;