使用Oracle

时间:2017-03-10 03:55:30

标签: sql oracle plsql

我有一个NAME(VARCHAR2)列,用于存储帐户的ID号。

ROW_NBR  NAME
----      -------------------------------------
1         JOHN SMITH ACCT_ID 123762839 PTY LTD
2         HELLOWORLD PTY LDT ACCT_ID: 123 762 839 CORP LTD
3         GLOBAL FUND PER_ID 32 123 456 789 ACCT_ID 989 190 293 CORP
4         WORLD CORP PER_ID: 32 123 456 789 ACCT_ID: 243 130 222 PTY

我试图提取9位数的ACCT_ID,删除“ACCT_ID%”' string,并将其存储到VARCHAR2(09)的列中。

结果应如下所示:

ROW_NBR  NAME                                     ACCT_ID
----     -------------------------------------    ----------
1        JOHN SMITH PTY LTD                       123762839
2        HELLOWORLD PTY LDT CORP LTD              123712833
3        GLOBAL FUND PER_ID 32 123 456 789 CORP   989190293
4        WORLD CORP PER_ID: 32 123 456 789 PTY    243130222

到目前为止,我已经能够提取ACCT_ID,前提是该数字没有空格。

SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(NAME, 'ACCT_ID \s*\d+'), '\d+') FROM DUAL;

这个SQL可以工作但仅适用于第一个记录,因为我可以获得9位数的ACCT_ID。如何为其余记录执行此操作?我无法在没有任何空格的情况下提取ACCT_ID值(例如,' 989190293')。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

使用REGEXP_REPLACE

尝试此操作
with t (ROW_NBR,  NAME) as (
    select 1 ,'JOHN SMITH ACCT_ID 123762839 PTY LTD'                       from dual union all
    select 2 ,'HELLOWORLD PTY LDT ACCT_ID: 123 762 839 CORP LTD'           from dual union all
    select 3 ,'GLOBAL FUND PER_ID 32 123 456 789 ACCT_ID 989 190 293 CORP' from dual union all
    select 4 ,'WORLD CORP PER_ID: 32 123 456 789 ACCT_ID: 243 130 222 PTY' from dual
)
-- Test data above. Actual solution start here --

select 
  replace(regexp_replace(name, '.*ACCT_ID\D*([0-9 ]+).*','\1'),' ')
from t;

产地:

123762839
123762839
989190293
243130222

答案 1 :(得分:0)

尝试(\s*\d)+ - 或者更好,(\s*\d){9},以防因某些原因在帐号后面还有其他数字。

未经过测试,但是这样:

SELECT row_nbr, name, REGEXP_SUBSTR(NAME, 'ACCT_ID:? ((\s*\d){9})', 1, 1, null, 1) 
FROM    <SOMETHING_SURELY_NOT_FROM_DUAL!>

两个注释:(1)您的输入有:在几个案例中ACCT_ID之后,在其他情况下它们没有。通过在搜索模式中添加:?来修复。 (2)输出将保留输入中的空格;如果不需要,您可以在replace( ..., ' ')内进行包装。