我希望从查询中长度可变的混合字母数字字符串中提取特定数字。我将需要这个来计算基于该数字的范围。我正在使用Oracle。
示例:
d-3-J32P232
- 我至少需要抓住J32,甚至很可能是该字符串中的32个。这个数字范围可以随时改变。
可能来自:
d-3-J1P232 至 的 d-3-J322P2342
第二个和第三个字母后面的数字可以是任意长度。有没有办法做到这一点?
答案 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可以完成这项工作