В Oracle/PLSQL, instr
функционируйте возвращает местоположение подстроки в строке.
Если подстрока не найдена, то instr
возвратится 0
.
Я хочу искать несколько подстрок в строке и возвратить первое ненулевое значение. Это может быть достигнуто с помощью regexp_instr
, но я хотел бы не -regexp_
решение.
Пример:
regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)')
должен возвратиться 12 (местоположение 'Park').
INSTR не поддерживает regex ORs - необходимо определить вызовы функции 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)
В зависимости от ваших потребностей, функция полнотекстового поиска может быть более подходящей?
.Очевидно, что без регэкспертизы такого элегантного решения не будет, если только Вы не напишете свою собственную функцию 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;