2016-12-15 7 views
0

Получение примеров из аналогичных нитей переполнению стека, Remove all characters after a specific character in PL/SQL и How to Select a substring in Oracle SQL up to a specific character?Использование REGEXP_SUBSTR с Струны Qualifier

Я хотел бы получить только первые символы до появления строки.

Пример:

STRING_EXAMPLE 
TREE_OF_APPLES 

Результирующий набор данных должен только показать только STRING_EXAM и TREE_OF_AP потому PLE мой разделителем

Всякий раз, когда я использую ниже REGEXP_SUBSTR, он получает только STRING_ потому что REGEXP_SUBSTR лечит PLE как отдельный выражения (P, L and E), а не как одно выражение (PLE).

SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^PLE]+',1,1) from dual; 

Как я могу это сделать без использования многочисленных INSTR и SUBSTR?

спасибо.

ответ

1

Проблема с вашим запросом заключается в том, что если вы используете [^PLE], он будет соответствовать любым символам, отличным от P или L или E. Вы ищете случайность PLE последовательно. Итак, используйте

select REGEXP_SUBSTR(colname,'(.+)PLE',1,1,null,1) 
from tablename 

Это возвращает подстроку до последнего вхождения PLE в строку.

Если строка содержит несколько экземпляров PLE и только подстроку до первого появления необходимо извлечь, использовать

select REGEXP_SUBSTR(colname,'(.+?)PLE',1,1,null,1) 
from tablename 
+0

Спасибо! работал как шарм. :) –

+0

Может ли строка содержать несколько строк PLE в строке? если это так, вы хотите только извлечь подстроку до первого появления? –

+0

да это можно. Я просто тестировал прямо сейчас и видел, что у меня есть данные, содержащие как минимум два слова 'PLE'. –

1

Зачем использовать регулярные выражения для этого?

select substr(colname, 1, instr(colname, 'PLE')-1) from... 

будет более эффективным.

with 
    inputs(colname) as (
     select 'FIRST_EXAMPLE' from dual union all 
     select 'IMPLEMENTATION' from dual union all 
     select 'PARIS'   from dual union all 
     select 'PLEONASM'  from dual 
    ) 
select colname, substr(colname, 1, instr(colname, 'PLE')-1) as result 
from inputs 
; 

COLNAME   RESULT 
-------------- ---------- 
FIRST_EXAMPLE FIRST_EXAM 
IMPLEMENTATION IM 
PARIS 
PLEONASM 
+0

На самом деле, это текущий код, который у меня есть, но я нашел его «слишком длинным», чтобы его понимали другие программисты. Но протестировав ваш подход, это было на самом деле намного быстрее (хотя всего на секунду или около того). позвольте мне перефразировать вопрос, чтобы я мог нарисовать лучшую картинку. –

+0

Это вне меня, как любой программист может понять не-жадное соответствие в регулярном выражении, но не может понять SUBSTR и INSTR. Не покупая его ... – mathguy

+0

Привет, у меня есть связанный с ним вопрос в http://stackoverflow.com/questions/41156391/performance-andreadable-of-regexp-substr-vs-instr-and-substr, вытекающий из этого. любезно взгляните. Спасибо. –

Смежные вопросы