[英]Extract ID number from String using REGEXP_SUBSTR in Oracle
我有一列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%”字符串,然后將其存儲到帶有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')。
先感謝您!
使用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
嘗試使用(\\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( ..., ' ')
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.