1

我希望从查询中长度可变的混合字母数字字符串中提取特定数字。我需要这个才能根据该数字计算范围。我正在使用甲骨文。

例子:

D-3-J32P232

-我至少需要抓住J32,而且很可能甚至是那根弦中的32。这个数字范围可以在任何给定时间改变。

它的范围可以是:

D-3-J1P232D-3-J322P2342

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

4

3 回答 3

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
于 2011-06-29T05:43:19.590 回答
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
于 2011-06-29T00:19:39.457 回答
1

REGEXP_SUBSTR可以完成这项工作

于 2011-06-29T00:19:07.017 回答