Sql 在Oracle中使用REGEXP\u SUBSTR从字符串中提取ID号
我有一个列名(VARCHAR2),它存储帐户的ID号Sql 在Oracle中使用REGEXP\u SUBSTR从字符串中提取ID号,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个列名(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
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
SELECT row_nbr, name, REGEXP_SUBSTR(NAME, 'ACCT_ID:? ((\s*\d){9})', 1, 1, null, 1)
FROM <SOMETHING_SURELY_NOT_FROM_DUAL!>
到目前为止,我已经能够提取帐户ID,前提是该号码没有空格
SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(NAME, 'ACCT_ID \s*\d+'), '\d+') FROM DUAL;
这个SQL只适用于第一条记录,因为我可以获得9位数的帐户ID。我如何对其余记录执行此操作?我无法让它只提取ACCT_ID值而不使用任何空格(例如“989190293”)
提前谢谢你 尝试使用
REGEXP\u 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}
,以防由于某种原因,帐号后面还有其他数字
未测试,但类似于以下内容:
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
SELECT row_nbr, name, REGEXP_SUBSTR(NAME, 'ACCT_ID:? ((\s*\d){9})', 1, 1, null, 1)
FROM <SOMETHING_SURELY_NOT_FROM_DUAL!>
选择行编号,名称,REGEXP\u SUBSTR(名称,'ACCT\u ID:?((\s*\d){9}),1,1,null,1)
从…起
两个注意事项:(1)您的输入在一些情况下有:after ACCT_ID,而在其他情况下没有。通过在搜索模式中添加
:?
进行修复。(2) 输出将保留输入中的空格;如果不希望这样做,您可以在替换(…,“”)
中进行包装,非常感谢!工作得很有魅力!:)