2015-12-03 97 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

相關問題