我有两个表,需要使用单个查询将管道分隔字符串中的值替换为另一个表中的值。
create table a( col1 Varchar2(100), col2 Varchar2(250));
insert into a values ('EMP', '1234|5678|9123');
create table b ( col1 Varchar2(100), col2 Varchar2(250));
insert into b values (1234 , 'Testing1');
insert into b values (5678, 'Values2');
insert into b values (9123 , 'Agree1');
我想要一个提供输出的查询:
第 1 栏 | 第 2 栏 |
---|---|
电磁脉冲 | 测试1|价值观2|同意1 |
在问题中没有有效的小提琴的情况下,我创建了两个公用表表达式(a 和 b)来创建数据。 然后,它将字符串从
a
拆分,连接到 b
,并将列表聚合回分隔字符串。
sortorder
可能不需要。 我没有花时间阅读 Oracle 是否保证 REGEXP_SUBSTR
和 LISTAGG
按您期望的顺序返回值。
我使用
DISTINCT
来每 a.col1
获取一行
看小提琴
with
a (
col1
, col2
) as (
select 'EMP', '1234|5678|9123' from dual
),
b (
col1
, col2
) as (
select 1234, 'Testing1' from dual
union select 5678, 'Values2' from dual
union select 9123, 'Agree1' from dual
),
c as (
select
col1
, regexp_substr(col2, '[^|]+', 1, level) as col2
from a
connect by regexp_substr(col2, '[^|]+', 1, level) is not null
),
d as (
select
c.col1
, b.col2
, row_number() over (partition by c.col1 order by 1) as sortorder
from c
inner join b on b.col1 = c.col2
)
select distinct
col1
, listagg(col2, '|') WITHIN GROUP (ORDER BY sortorder) over (partition by col1) AS col2
from d
这假设输出应该始终只有一行
a.col1
值。