2017-12-04 9 views
1

배경 지식 :oracle regexp_like()에서 적은 수의 문자열로 일치 항목을 제외 할 수 있습니까?

  1. 우리는 사용할 수 없습니다 REGEXP_LIKE 이후, 제외() 부정적 예측을 지원하지 않습니다 (?!).
  2. 나는
  3. [^] 단일 문자 만 부정 할 수 ') (REGEXP_LIKE NOT'가 아니라 문자열 사용하여 제외하지 않으려는

질문 :

관심이 알 orge regexp_like()에 전달되는 정규 표현식 자체를 변경하는 대안이 있다면.

시나리오 예를 설명합니다 :

정규 표현식을 - "표준 * TIME."즉 표준과 시간 모두를 포함하는 모든 시간대와 일치합니다() REGEXP_LIKE에 사용됩니다. 일치하는 시간대에서 '인디언 표준시', '대서양 표준시', '아일랜드 표준시'를 제외하고 싶습니다.

+0

"NOT"을 사용하지 않는 이유는 무엇입니까? –

답변

0

'NOT'을 사용하지 않는 이유를 알고 싶습니다. 하지만 재미를위한 정규식 솔루션을 찾고 있다면 REGEXP_LIKE가 오라클의 풍미가 부정적인 look-ahead를 지원하지 않기 때문에 작동하지 않을 것이라고 생각합니다. 그러나 상자 밖에서 조금 생각하고 패턴을 찾을 수 없으면 REGEX_REPLACE가 NULL을 반환한다는 것을 알기 때문에 다음과 같이 할 수 있습니다. (꼭 할 필요가 없기 때문에 REGEXP_LIKE와 함께 NOT을 사용합니다.)

SQL> with tbl(str) as (
    select 'INDIAN STANDARD TIME' from dual union all 
    select 'ATLANTIC STANDARD TIME' from dual union all 
    select 'IRISH STANDARD TIME' from dual union all 
    select 'EASTERN STANDARD TIME' from dual union all 
    select 'PST STANDARD TIME' from dual union all 
    select 'CST STANDARD TIME' from dual 
    ) 
    select str 
    from tbl 
    where str = regexp_replace(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME', 'DO NOT WANT THESE'); 

STR 
---------------------- 
EASTERN STANDARD TIME 
PST STANDARD TIME 
CST STANDARD TIME 

SQL> 

이렇게하면 원하지 않는 문자열을 대체 한 다음 비교합니다. 일치 항목이 없기 때문에 select가 리턴하지 않습니다. 아직 깨끗하지 못함 :

select str 
from tbl 
where NOT regexp_like(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME');