2016-08-03 2 views
0

я работаю с БД Oracle, и я пытаюсь найти и извлечь все вхождения в строке, соответствующей заданный шаблон ...Oracle REGEXP_SUBSTR - Найти и извлечь все возникновения в колонке

Это должно быть 3 буквы, 3 цифры, а затем, может быть, письмо или не

Я попытался это:

SELECT REGEXP_SUBSTR(my_column, '[A-Za-z]{3}(\d)(\d)(\d)') AS values 
FROM my_table 

но это возвращает только первое вхождение.

Использование

REGEXP_SUBSTR(my_column, '[A-Za-z]{3}(\d)(\d)(\d)', 0, 0, 'i') 

не работает либо

Кто-нибудь есть какие-нибудь идеи?

Edit:

Я пытаюсь извлечь его из PLSQL файлов. Так его довольно много, как SQL запросы, как

select * 
from abc123 
where some_value = 'some_value' 
+0

Пожалуйста, разместите данные примера и желаемый результат; например, что вы ожидаете от «ABC123CDE456FGHI789»? – Aleksej

+0

regexp_substr cant accpet 0 как параметр. –

+0

@sanjay radadiya Да, он может принимать 0 в качестве параметра. просто не для позиции. Вы можете использовать его для параметра occension ... – javaBeginner

ответ

1

Попробуйте этот запрос сломать ABC123CDE456FGHI789 squence

with mine as (select 'ABC123CDE456FGH789' hello from dual) 
select regexp_substr(hello, '[A-Za-z]{3}(\d){3}', 1, level) STR from mine 
connect by regexp_substr(hello, '[A-Za-z]{3}(\d){3}', 1, level) is not null 

Выходного

ABC123 
CDE456 
GHI789 

Для Конкретного постиона, то вы хотите использовать

select regexp_substr('ABC123CDE456FGH789', '[A-Za-z]{3}(\d){3}', 1, i) STR from dual 

изменения я ценю в соответствии с положением, как

select regexp_substr('ABC123CDE456FGH789', '[A-Za-z]{3}(\d){3}', 1, 1) STR from dual 

Выход:

ABC123 
+0

Спасибо большое. это действительно помогает мне. – javaBeginner

+0

Есть ли способ ускорить этот запрос? – javaBeginner

+0

Запрос уровня и регулярное выражение - это системный объект, поэтому он всегда быстр в сравнении с извлечением данных из базы данных. –

1

Попробуйте получить номер в 1.2.3 (предположим, что это область страны)

SELECT str,level,REGEXP_SUBSTR(str, '[0-9]', 1, LEVEL) AS substr 
FROM (
SELECT country_domain str from country where regexp_like(country_domain, '[0-9]') 
) 
CONNECT BY LEVEL <= REGEXP_count(str, '[0-9]'); 

Выход

STR LEVEL SUBSTR 
1.2.3 1  1 
1.2.3 2  2 
1.2.3 3  3 
Смежные вопросы