需要用另一个表中的值替换分隔字符串

问题描述 投票:0回答:1

我有两个表,需要使用单个查询将管道分隔字符串中的值替换为另一个表中的值。

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
sql oracle
1个回答
0
投票

在问题中没有有效的小提琴的情况下,我创建了两个公用表表达式(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
值。

© www.soinside.com 2019 - 2024. All rights reserved.