Oracle извлекает номер переменной из строки

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

Пример:

D-3-J32P232

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

Он может варьироваться от:

От D-3-J1P232 до D-3-J322P2342

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


person JoshG    schedule 28.06.2011    source источник


Ответы (3)


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_REPLACE бит менее прямолинейно, так как они не добавляли возможность ссылаться на подвыражения до 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
person DCookie    schedule 29.06.2011
comment
Спасибо, это было очень полезно. - person JoshG; 30.06.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
person josephj1989    schedule 29.06.2011

REGEXP_SUBSTR сделает эту работу.

person Gary Myers    schedule 29.06.2011