SQL PLSQL如何对从字符串列获取的值创建查找

SQL PLSQL如何对从字符串列获取的值创建查找,sql,oracle,Sql,Oracle,我在PL/SQL方面没有问题,我正在努力解决下面的问题 我的代码如下: select view1.col1 from view1 Col1是字符串列。该查询检索以下2条记录 view1.col1 ----------------- Foo [40] boo boo foo [11] loo [abc] Loo [2] foo foo [a31] foo boo [32] view1.col1中的数值还有另一个字典表 表2 ID|Description| 1 | A 2 | G2 3 | C4

我在PL/SQL方面没有问题,我正在努力解决下面的问题

我的代码如下:

select view1.col1 from view1
Col1
是字符串列。该查询检索以下2条记录

view1.col1
-----------------
Foo [40] boo boo foo [11] loo [abc]
Loo [2] foo foo [a31] foo boo [32]
view1.col1中的数值还有另一个字典表

表2

ID|Description|
1 | A
2 | G2
3 | C4
32| EE2
11| AA2
40| U1
99| ZZ6 
我有另一个表,我希望加入该表,以便用表2.col2中的描述性值替换示例编号[40]、[11]、[2]、[32]中括号[]中的唯一数值

我希望检索代码的结果

-----------------
Foo U1 boo boo foo AA2 loo [abc]
Loo G2 foo foo [a31] foo boo EE2

对于PL/SQL初学者来说,这是一个相当棘手的问题。它需要几个Oracle内置程序才能得到正确答案

不管怎样,这里有一个函数可以实现这一点。它使用正则表达式来计算、查找和替换占位符。因此,性能可能并不出色,但应该可以接受

create or replace function substitution (p_str in varchar2) 
    return varchar2
as
    rv varchar2(4000);
    cnt pls_integer;
    l_id t2.id%type;
    l_sub t2.description%type;
begin
    rv := p_str;
    cnt := regexp_count(p_str, '\[([[:digit:]]+)\]');
    if cnt > 0 then
        for idx in 1..cnt loop
            l_id := to_number(rtrim(ltrim( regexp_substr(p_str, '\[([[:digit:]]+)\]', 1, idx ), '['),']'));
            select description 
            into l_sub
            from t2
            where id = l_id;
            rv := regexp_replace(rv, '\[([[:digit:]]+)\]', l_sub, 1, idx );
        end loop;
    end if;
    return rv;
end;
/
你这样称呼它:

select col1 as old_col
       , substitution(col1) as new_col
from view1;

您使用的是什么版本的Oracle?这可以使用递归的CTE.Oracle数据库11g 11.2.0.4.0-64位来完成