Практики Oracle годами выживали без регулярных выражений, потому что Oracle предоставляет несколько простых строковых функций, которые мы можем комбинировать для некоторых изящных манипуляций.
Например, чтобы найти первые два символа после последнего символа подчеркивания в строке, используйте SUBSTR() и INSTR() следующим образом:
with t as (select 'SPRINTMVNO_PM_CDR_IWIRELESS_20121110_0813.csv' str from dual)
select substr(str, instr(str, '_', -1)+1, 2)
from t
/
Обратите внимание, что вызов INSTR() имеет отрицательное смещение, чтобы начать отсчет с конца. Получение последних четырех символов строки использует тот же трюк:
with t as (select 'iwireless_201211120015_201211120515' str from dual)
select substr(str, -4)
from t
/
Самый простой способ определить шаблон подчеркивания, за которым следуют цифры, за которыми следует подчеркивание, — это регулярное выражение, но мы можем использовать TRIM(), чтобы удалить символы подчеркивания из результата.
with t as (select 'RK_IPDR_RKMSG2_0043722_DT_20121113162710.txt' str from dual)
select trim('_' from regexp_substr(str, '_([0-9]+)_'))
from t
/
Вот скрипт SQL, чтобы доказать, что эти методы работают.
Oracle имеет широкий набор функций, которые описаны в документации. Подробнее.
"пожалуйста, игнорируйте случаи, мне просто нужно решение этого "как получить содержимое между символом или начать с него, но не включать его, с регулярным выражением Oracle?"
Существует способ исключить символы из начала или конца результата, а именно разбить шаблон поиска на подвыражения. Это будет работать для предоставленной вами строки, потому что мы можем отделить начальные и конечные символы подчеркивания от требуемых чисел. К сожалению, параметр подвыражения имеет значение . последний параметр в подписи REGEXP_SUBSTR(), а поскольку функции SQL не принимают именованные параметры, это означает, что мы должны явно передавать значения по умолчанию для всех остальных параметров.
В любом случае, этот вызов вернет второе подвыражение, которое является искомой строкой, 0043722
:
with t as (select 'RK_IPDR_RKMSG2_0043722_DT_20121113162710.txt' str from dual)
select regexp_substr(str, '(_)([0-9]+)(_)', 1,1,'i',2)
from t
/
Варианты использования действительно имеют значение. Функции REGEXP работают медленнее, чем их более простые эквиваленты. В 10gR2 REGEXP_SUBSTR() как минимум на порядок медленнее, чем SUBSTR(). Разница заметна при поиске большого количества строк и наносит вред, когда это число достигает миллионов (раскрытие: недавняя боль).
person
APC
schedule
17.11.2012