2013-10-01 1 views
0

다음과 같은 SQL을 다시 작성하여 추출 할 수있는 방법을 찾는 데 도움이 필요합니다. 필드의 오른쪽에서 오는 콜론 (:) 또는 슬래시 (/)의 첫 번째 인스턴스 뒤에옵니다.Oracle/SQL : ':'또는 '/'의 오른쪽에서 모든 데이터 가져 오기

나는 현재 다음과 같은 것을 사용하지만은 콜론 (이후에서 끌어 :) 내가 너무 슬래시 (/)에 대한보고 싶지 다음의 데이터

select substr(DBURL,instr(DBURL,':',-1)+1) as DB 
from databasename; 

예 DBURL 입력란 :

trld:client:blah:data 
trld:client:blah/data 

스팅의 데이터 부분 만 추출합니다.

답변

2

Regular Expressions, 특히 REGEXP_SUBSTR을 사용할 수 있습니다. 패턴을 깨는

select regexp_substr(DBURL,   --source string 
        '[^:/]+$'   --pattern that you are looking for 
        ) as DB 
    from databasename; 

,

[^:/] : match anything other than a colon or slash. 
+  : match the preceding pattern one or more times 
$  : match the end of the string. 

하는 togather입니다 퍼팅,이 패턴은 대장 이외의 모든 항목과 일치하거나 문자열의 마지막에 슬래시.

2

instr 중 두 개를 greatest에두면됩니다.

11:17:02 (20)[email protected]> ed 
Wrote file S:\spool\dwal\BUF_SYSTEM_20.sql 

    1 with databasename(dburl) as (
    2 select 'trld:client:blah:data' from dual union all 
    3 select 'trld:client:blah\data' from dual 
    4 ) 
    5 select substr(DBURL,greatest(instr(DBURL,'\',-1), instr(DBURL,':',-1))+1) as DB 
    6* from databasename 
11:17:14 (20)[email protected]>/

DB 
--------------------- 
data 
data 

Elapsed: 00:00:00.10 

RegEx는 괜찮지 만 느립니다.

관련 문제