2010-01-06 25 views
5

Oracle/PLSQL에서 instr 함수는 문자열의 하위 문자열 위치를 반환합니다.Oracle INSTR 함수를 사용하여 여러 문자열 검색

하위 문자열이 없으면 instr0을 반환합니다.

문자열에서 여러 하위 문자열을 검색하고 첫 번째 0이 아닌 값을 반환하고 싶습니다. 이는 regexp_instr을 사용하여 수행 할 수 있지만 비 regexp_ 솔루션을 원합니다.

예 :

regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)') 

('공원'의 위치) (12)를 반환해야합니다.

답변

4

INSTR은 정규식 OR을 지원하지 않습니다. 확인할 각 하위 문자열에 대해 INSTR 함수 호출을 정의해야합니다. regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)')의 등가은 다음과 같습니다

WHERE (INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Apple') > 0 
     OR 
     INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Park') > 0 
     OR 
     INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Shores') > 0) 

필요에 따라, 전체 텍스트 검색 기능은 당신이 원하는쪽으로 더 할 수 있는가?

2

분명히 regexp가 없으면 동일한 작업을 수행하는 고유 한 PL/SQL 함수를 작성하지 않는 한 멋진 해결책은 없습니다. 그렇지 않으면 다음과 같이해야합니다.

with data as (select '500 Oracle Parkway, Redwood Shores, CA' string from dual) 
select nvl(min(pos),0) from 
(select instr(data.string, 'Apple') pos 
    union all 
    select instr(data.string, 'Park') pos 
    union all 
    select instr(data.string, 'Shores') pos 
) 
where pos > 0; 
+0

놀라운 답변입니다. 그래서 나는 그것을 시도했다. 그리고 그 성능을 살펴 보았습니다. 쿼리를 PL/SQL 인터프리터에서 Oracle로 보냅니다. 즉, 수행하려는 작업을 수행하는 데 매우 느린 방법입니다. –

+0

나는 그것을 의심하지 않는다! –

+0

@Schlump : "PL/SQL 인터프리터에서 Oracle에 쿼리를 보냅니다"? –

관련 문제