使用Oracle INSTR函数搜索多个字符串

时间:2010-01-06 16:26:54

标签: sql regex oracle string

在Oracle / PLSQL中,instr函数返回字符串中子字符串的位置。

如果找不到子字符串,则instr将返回0

我想在字符串中搜索多个子字符串并返回第一个非零值。这可以使用regexp_instr来实现,但我想要一个非regexp_解决方案。

实施例

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

应该返回12('Park'的位置)。

5 个答案:

答案 0 :(得分: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)

根据您的需要,全文搜索功能可能更符合您的需求?

答案 1 :(得分: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;

答案 2 :(得分:0)

请检查以下内容---

select regexp_instr ('500 Oracle Parkway, Redwood Shores, CA', 'Apple|Park|Shores', 1, 1, 0, 'i') as result
from dual;

答案 3 :(得分:0)

select 
    coalesce(
        nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Apple'),0),
        nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Park'),0),
        nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Shores'),0)
    ) as xxx
from dual

答案 4 :(得分:0)

根据我的说明 instr 不会给出字符串中字符的每个位置,因此如果需要,请使用以下代码。

 SELECT literal,indx FROM  (SELECT substr('HelloWorld',level,1) as literal,level as indx FROM DUAL CONNECT BY LEVEL <= length('HelloWorld'))WHERE literal IN ('l','o') ORDER BY literal

在上面我正在检查字符串'HelloWorld'中的文字'l',上面的查询给出了所有匹配的位置。您可以将上面的代码增强功能并根据需要使用。