我想从var-char字段获取固定长度数字。假设我有一个像text1234567890fortex23466666sortes1234567890123
这样的字符串然后我想得到哪个数字在字符之间连续固定10位数,即1234567890
和我的数据也像text1234567fortex23466666sortes0987654321
然后输出应该是0987654321
答案 0 :(得分:0)
使用
generate
提取第一次出现的最大10位数字。您必须对结果进行后处理以删除包含的非数字。基于regexp的重复提取的完整解决方案是:
Select regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) from dual;
或者,按案例分解预处理:
Select regexp_substr (
regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' )
, '[0-9]{10}'
)
from dual
;
如果你想避免多次调用regexp函数,你需要诉诸Select case length(i.interim)
When 10 then i.interim
When 12 then substr(i.interim, 2, 10 )
Else case when regexp_instr(i.interim, '[0-9]') = 1
Then substr ( i.interim, 1, 10 )
Else substr ( i.interim, 2 )
End
End
From (
Select regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) interim from dual
) i
;
:
regexp_replace
注意强>
在12c中,Select regexp_replace( <text>, '^(.*[^0-9])?([0-9]{10})([^0-9].*)?$', '\2' ) from dual;
补充了一个新参数,以返回完整匹配的捕获组:
regexp_substr
最后一个参数表示捕获组,插入的参数表示匹配,发生和匹配参数的起始位置,resp。有关详细信息,请参阅the oracle docs。