我试图编写SQL查询,从给定的字符串中提取所有数字序列。例如来自字符串:
'<rej:idnymu s7fn we2dfgdg="http://dfgrgdfgfZszik">278579133</rej:>
<rej:idnymu k3op d5dfgdg="http://dfgrgdfgfZszik">118545112</rej:>
<rej:idnymu s1rd s9dfgdg="http://dfgrgdfgfZszik">271238461</rej:>'
我想提取类似的内容:
278579133, 118545112, 271238461
最重要但最难做的是忽略单个数字出现时的情况:&#34; s7fn&#34;或者&#34; we2d&#34;。
到目前为止,我能够像这样进行查询:
SELECT Regexp_replace(
'<rej:idnymu s7fn we2dfgdg="http://dfgrgdfgfZszik">278579133</rej:> <rej:idnymu k3op d5dfgdg="http://dfgrgdfgfZszik">118545112</rej:> <rej:idnymu s1rd s9dfgdg="http://dfgrgdfgfZszik">271238461</rej:>'
, '([^0-9])', '') RESULT
FROM dual;
但是我不知道如何分配数字序列,更重要的是如何摆脱我之前提到的单个数字。
有人可以建议如何实现这个目标吗?
更新
整个字符串看起来或多或少像这样:
'<efwewfsdf/>
<asdf>
<qwe>
<rej:aaa ns2=rnsjvnsvjrlntjnbsnbltdbk">64-0203-0875/4</rej:aaa>
<rej:bbb ns2=bmtbrbpnrtusrnbdbd k">06396</rej:bbb>
<rej:ccc ns2=vmkfbkmbkfmgkmfgkbgfk">4567650</rej:ccc>
<rej:ddd ns2=zxczxczczxczxczxk">402341198</rej:ddd>
<rej:eee ns2=asdasdasdazxck">723112</rej:eee>
<rej:eee ns2=adasdasdawawqweqwek">342253</rej:eee>
<rej:eee ns2=bgbgfnnhnhnhnhnhnk">656345</rej:eee>
<rej:fff ns2=ewretyrtyghnk">352</rej:fff>
<rej:ggg ns2="vzxczdvdbdfgs">asd.Gdsa</rej:ggg>
<rej:hhh ns2="zcsasdqwfwgerbyn">W1_22</rej:hhh>
</qwe>
</asdf>'
通常它会更长,我从blob获得它。查询如下所示:
SELECT REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:aaa[^<]*')), '.*>', '') aaa,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:bbb[^<]*')), '.*>', '') bbb,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:ccc[^<]*')), '.*>', '') ccc,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:ddd[^<]*')), '.*>', '') ddd,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:eee[^<]*')), '.*>', '') eee,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:eee[^<]*')), '.*>', '') eee,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:eee[^<]*')), '.*>', '') eee,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:fff[^<]*')), '.*>', '') fff,
REGEXP_REPLACE((REGEXP_SUBSTR(utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 300)) || utl_raw.cast_to_varchar2(dbms_lob.substr(tn.blob_value, 2000, 2300)), '<rej:ggg[^<]*')), '.*>', '') ggg,
tn.blob_value
FROM table_name tn
问题是&#34; rej:eee&#34;标签是相同的,我不知道如何区分它们。字符串也有1-5&#34; rej:eee&#34;标签所以它不是固定的数字。
希望现在更透明,抱歉我的英语不好。
由于 RAV
答案 0 :(得分:1)
试试这个:
with t(d) as (
select '<efwewfsdf/>
<asdf>
<qwe>
<rej:aaa ns2=rnsjvnsvjrlntjnbsnbltdbk">64-0203-0875/4</rej:aaa>
<rej:bbb ns2=bmtbrbpnrtusrnbdbd k">06396</rej:bbb>
<rej:ccc ns2=vmkfbkmbkfmgkmfgkbgfk">4567650</rej:ccc>
<rej:ddd ns2=zxczxczczxczxczxk">402341198</rej:ddd>
<rej:eee ns2=asdasdasdazxck">723112</rej:eee>
<rej:eee ns2=adasdasdawawqweqwek">342253</rej:eee>
<rej:eee ns2=bgbgfnnhnhnhnhnhnk">656345</rej:eee>
<rej:fff ns2=ewretyrtyghnk">352</rej:fff>
<rej:ggg ns2="vzxczdvdbdfgs">asd.Gdsa</rej:ggg>
<rej:hhh ns2="zcsasdqwfwgerbyn">W1_22</rej:hhh>
</qwe>
</asdf>' from dual
), t1(d) as (
select SUBSTR(d, REGEXP_INSTR(d, '<[A-Za-z]{3}:', 1, level), REGEXP_INSTR(d, '</rej:[A-Za-z]{3}>', 1, level) - REGEXP_INSTR(d, '<[A-Za-z]{3}:', 1, level))
from t
connect by rownum < LENGTH(d) - LENGTH(REGEXP_REPLACE(d, ':[A-Za-z]{3}>', ''))
)
select REGEXP_REPLACE(d, '^<rej:.*">', '') ff from t1
FF
--------------
64-0203-0875/4
06396
4567650
402341198
723112
342253
656345
352
asd.Gdsa
W1_22