Oracle извлекает номер переменной из строки - PullRequest
1 голос
/ 29 июня 2011

Я ищу, чтобы извлечь конкретное число из строки смешанных буквенно-цифровых символов переменной длины в запросе. Мне это нужно для того, чтобы рассчитать диапазон на основе этого числа. Я использую Oracle.

Пример:

D-3-J32P232

-Мне нужно взять J32 как минимум, и, скорее всего, даже 32 из этой строки. Этот диапазон чисел может измениться в любой момент времени.

Может варьироваться от:

D-3-J1P232 в D-3-J322P2342

Числа после второй и третьей букв могут быть любой длины. Есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

Это проще и получает оба числа для диапазона

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
2 голосов
/ 29 июня 2011

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
1 голос
/ 29 июня 2011

REGEXP_SUBSTR выполнит работу

...