2017-03-10 40 views
1

我有一列NAME(VARCHAR2),它存儲帳戶的ID號。使用Oracle中的REGEXP_SUBSTR從字符串中提取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%' 的字符串,並將其存儲到與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

試試這個使用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 
+0

非常感謝!像魅力一樣工作! :) – Aurora

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(..., ' ')之內。