2010-01-06 373 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