Oracle从字符串中提取变量号

时间:2011-06-28 23:19:10

标签: string oracle substring substr

我希望从查询中长度可变的混合字母数字字符串中提取特定数字。我将需要这个来计算基于该数字的范围。我正在使用Oracle。

示例:

d-3-J32P232

- 我至少需要抓住J32,甚至很可能是该字符串中的32个。这个数字范围可以随时改变。

可能来自:

d-3-J1P232 至 的 d-3-J322P2342

第二个和第三个字母后面的数字可以是任意长度。有没有办法做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

REGEXP_SUBSTR可以工作(11g版本):

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

答案 2 :(得分:1)

REGEXP_SUBSTR可以完成这项工作