2015-12-03 65 views
0

我想从var-char字段获得固定长度的数字。假设我有一个字符串,如text1234567890fortex23466666sortes1234567890123那么我想得到哪个数字在字符间连续固定了10个数字,即1234567890和My数据也喜欢text1234567fortex23466666sortes0987654321然后输出应为0987654321如何从oracle中的字符串获得固定长度的数字

回答

0

使用

Select regexp_substr (<text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)') from dual; 

以提取最大10位数字的第一次出现。您必须对结果进行后处理以删除包含的非数字。反复基于正则表达式提取一个完整的解决方案是:

Select regexp_substr (
      regexp_substr (<text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)') 
      , '[0-9]{10}' 
     ) 
    from dual 
    ; 

另外,分解的案件预处理:

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

Select regexp_replace(<text>, '^(.*[^0-9])?([0-9]{10})([^0-9].*)?$', '\2') from dual; 

注意

在12C,regexp_substr已经补充了新的参数,返回一个捕获组instaed完全吻合的:

Select regexp_substr (<text>, '(^|[^0-9])([0-9]{10})([^0-9]|$)', 1, 1, '', 2) from dual; 

最后一个参数表示捕获组,中间的参数表示的比赛开始的位置,发生,匹配参数,resp .;详细信息请参见the oracle docs

+0

谢谢,你的第一个解决方案工作正常,但不是使用REGEXP_SUBSTR两次,它可能通过使用单个REGEXP_SUBSTR获得相同的结果 – user1463065

+0

在11g2中,regexp_substr只能提取整个匹配。这将包括任何周围的非数字。 Afaik Oracle的正则表达式语法不支持lookaround语法。 12c为regexp_substr引入了一个新参数,该参数指定要返回的捕获组而不是完整匹配。或者,使用regexp_replace(调整模式以匹配完整的字符串)。我会相应地补充我的答案。 – collapsar

+0

我们只使用oracle12c。您能否使用12c中的单个REGEXP_SUBSTR提供相同的功能 – user1463065

相关问题