我有一个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')。
提前谢谢!
答案 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( ..., ' ')
内进行包装。