我希望从查询中长度可变的混合字母数字字符串中提取特定数字。我需要这个才能根据该数字计算范围。我正在使用甲骨文。
例子:
D-3-J32P232
-我至少需要抓住J32,而且很可能甚至是那根弦中的32。这个数字范围可以在任何给定时间改变。
它的范围可以是:
D-3-J1P232 到 D-3-J322P2342
第二个和第三个字母之后的数字可以是任意长度。有没有办法做到这一点?
这更简单,并获得范围的两个数字
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
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
REGEXP_SUBSTR可以完成这项工作