在Oracle / PLSQL中,instr
函数返回字符串中子字符串的位置。
如果找不到子字符串,则instr
将返回0
。
我想在字符串中搜索多个子字符串并返回第一个非零值。这可以使用regexp_instr
来实现,但我想要一个非regexp_
解决方案。
实施例
regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)')
应该返回12('Park'的位置)。
答案 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',上面的查询给出了所有匹配的位置。您可以将上面的代码增强功能并根据需要使用。