2010-01-06 372 views
5

在Oracle/PLSQL中,instr函數返回字符串中子字符串的位置。使用Oracle INSTR函數搜索多個字符串

如果未找到子字符串,則instr將返回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

顯然沒有正則表達式不會有這樣一個完美的解決方案,除非你自己寫的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發送查詢 - 換句話說,這是一個非常緩慢的方法來做你正在做的事情! – 2010-01-06 17:26:40

+0

我不懷疑它! – 2010-01-06 17:36:21

+0

@Schlump:「從PL/SQL解釋器發送查詢到Oracle」? – 2010-01-07 12:39:06