SQL PLSQL如何对从字符串列获取的值创建查找
我在PL/SQL方面没有问题,我正在努力解决下面的问题 我的代码如下: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
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位来完成