Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中使用REGEXP\u SUBSTR从字符串中提取ID号_Sql_Oracle_Plsql - Fatal编程技术网

Sql 在Oracle中使用REGEXP\u SUBSTR从字符串中提取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

我有一个列名(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
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) 输出将保留输入中的空格;如果不希望这样做,您可以在
替换(…,“”)
中进行包装,非常感谢!工作得很有魅力!:)