Используйте Oracle функция INSTR для поиска нескольких строк

В Oracle/PLSQL, instr функционируйте возвращает местоположение подстроки в строке.

Если подстрока не найдена, то instr возвратится 0.

Я хочу искать несколько подстрок в строке и возвратить первое ненулевое значение. Это может быть достигнуто с помощью regexp_instr, но я хотел бы не -regexp_ решение.

Пример:

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

должен возвратиться 12 (местоположение 'Park').

6
задан shA.t 17 June 2015 в 07:35
поделиться

2 ответа

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)

В зависимости от ваших потребностей, функция полнотекстового поиска может быть более подходящей?

.
5
ответ дан 17 December 2019 в 00:10
поделиться

Очевидно, что без регэкспертизы такого элегантного решения не будет, если только Вы не напишете свою собственную функцию 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
ответ дан 17 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: