如何从oracle中的字符串中获取固定长度的数字

时间:2015-12-03 04:35:25

标签: sql oracle oracle11g

我想从var-char字段获取固定长度数字。假设我有一个像text1234567890fortex23466666sortes1234567890123这样的字符串然后我想得到哪个数字在字符之间连续固定10位数,即1234567890和我的数据也像text1234567fortex23466666sortes0987654321然后输出应该是0987654321

1 个答案:

答案 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