我们得到了提供源帐户ID和数据库ID的用户的输入。这里的问题是输入将是:[222].[2]
。我需要过滤第一个[222]
作为源帐户ID,第二个值过滤在[2]中作为数据库ID。
输入
[222].[2] ([srcacct id].[database id])
我们需要删除括号"["
和"."
。
输出
Source Account id=222, DBID=2
PS:在sql中,我有一个返回期望值的函数,但是我对Oracle不熟悉,因此需要一些输入。
答案 0 :(得分:2)
在这种情况下,正则表达式非常简单;将第一个数字用于源帐户,将第二个数字用于 DBID -这是REGEXP_SUBSTR
函数的最后一个参数。
例如:
SQL> with test (col) as
2 (select '[222].[2] ([srcacct id].[database id])' from dual)
3 select regexp_substr(col, '\d+', 1, 1) source_account,
4 regexp_substr(col, '\d+', 1, 2) dbid
5 from test;
SOU D
--- -
222 2
SQL>
[编辑:变量]
这取决于您使用的客户端工具。在SQL * Plus中,您将使用'&&col
'(或您要提供的任何名称)并运行
SQL> set ver off
SQL> select regexp_substr('&&col', '\d+', 1, 1) source_account,
2 regexp_substr('&&col', '\d+', 1, 2) dbid
3 from dual;
Enter value for col: [222].[2] ([srcacct id].[database id]
SOU D
--- -
222 2
SQL> undefine col
最后,请取消定义它,因为“ &&”将永远保留其值 。
无论如何,如果要“传递”某些东西并“返回”结果,请考虑编写一个功能。它无处不在。例如:
SQL> create or replace function f_ret (par_input in varchar2)
2 return varchar2
3 is
4 begin
5 return 'Source account ID = ' || regexp_substr(par_input, '\d+', 1, 1) ||
6 ', DBID = ' || regexp_substr(par_input, '\d+', 1, 2);
7 end;
8 /
Function created.
SQL> select f_ret('[222].[2] ([srcacct id].[database id])') result from dual;
RESULT
--------------------------------------------------------------------------------
Source account ID = 222, DBID = 2
SQL>
[编辑#2:查找表]
您编写的代码(作为注释)将不会编译;你不能那样做。这是一个看起来像的例子。我现在无法测试;自己做。
create or replace function f_ret (par_input in varchar2)
return varchar2
is
l_source_account_id number;
l_dbid number;
retval varchar2(200);
begin
l_source_account_id := regexp_substr(par_input, '\d+', 1, 1);
l_dbid := regexp_substr(par_input, '\d+', 1, 2);
select count(*)
into l_cnt
from accounts_table
where srcaccountid = l_source_account_id;
if l_cnt > 0 then
retval := 'Source account ID = ' || regexp_substr(par_input, '\d+', 1, 1) ||
', DBID = ' || regexp_substr(par_input, '\d+', 1, 2);
end if;
return retval;
end;