2011-06-28 60 views
1

我正在尋找從查詢中長度可變的混合字母數字字符字符串中提取特定數字。我將需要這個來計算基於該數字的範圍。我正在使用Oracle。Oracle從字符串中提取可變數字

實施例:

d-3-J32P232

-I需要抓住至少J32,以及最有可能甚至在32出該字符串的。這個範圍的數字可以在任何給定的時間改變。

它的範圍可以從:

d-3-J1P232d-3-J322P2342

在第二和第三字母后的數字可以是任何數目的長度。有沒有辦法做到這一點?

回答

2

REGEXP_SUBSTR可以工作(11克版):

SELECT REGEXP_SUBSTR('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)(\d+)',1,1,'i',2) num 
    FROM dual; 

您的樣本數據的測試:

SQL> SELECT REGEXP_SUBSTR('D-3-J322P2342',''([A-Z]+-\d+-[A-Z]+)(\d+)',1,1,'i',2) num 
    2 FROM dual; 

NUM 
--- 
322 

SQL> 

這將接受任何情況下阿爾法字符串,接着是破折號,接着是一個或多個數字,接着是破折號,接着是另一個任意情況的字母串,然後是您感興趣的數字。

10g REGEXP_REPLAC E,這是有點不太簡單,因爲他們不加引用子表達式,直到11g中的能力:

SELECT REGEXP_SUBSTR(str,'\d+',1,1) NUM 
    FROM (SELECT REGEXP_REPLACE('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)','',1,1,'i') str 
      FROM dual); 

您的樣本數據:

SQL> SELECT REGEXP_SUBSTR(str,'\d+',1,1) NUM 
    2 FROM 
     (SELECT REGEXP_REPLACE('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)','',1,1,'i') str 
    3  FROM dual); 

NUM 
--- 
322 
+0

謝謝,這是非常有幫助的。 – JoshG

3

這是簡單的,並得到兩範圍內的數字

select substr(REGEXP_SUBSTR('D-3-J322P2342','[A-Z][0-9]+',1,1),2), 
      substr(REGEXP_SUBSTR('D-3-J322P2342','[A-Z][0-9]+',1,2),2) 
from dual