如何删除字符串的替换部分?

时间:2018-07-23 07:23:54

标签: oracle oracle11g oracle10g

我们得到了提供源帐户ID和数据库ID的用户的输入。这里的问题是输入将是:[222].[2]。我需要过滤第一个[222]作为源帐户ID,第二个值过滤在[2]中作为数据库ID。

输入

[222].[2] ([srcacct id].[database id])

我们需要删除括号"[""."

输出

Source Account id=222, DBID=2

PS:在sql中,我有一个返回期望值的函数,但是我对Oracle不熟悉,因此需要一些输入。

1 个答案:

答案 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;