Используйте функцию Oracle INSTR для поиска нескольких строк - PullRequest
6 голосов
/ 06 января 2010

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

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

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

Пример:

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

должен вернуть 12 (местоположение «Park»).

Ответы [ 5 ]

5 голосов
/ 06 января 2010

INSTR не поддерживает регулярные выражения ИЛИ - вам нужно определить вызовы функций 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 голосов
/ 06 января 2010

Очевидно, что без регулярного выражения не будет такого элегантного решения, если вы не напишите свою собственную 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 голосов
/ 06 февраля 2019

по моему мнению 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

В приведенном выше примере я проверял литерал 'l' в строке 'HelloWorld'. Приведенный выше запрос дает все совпадающие позиции. Вы можете улучшить приведенный выше код и использовать его в соответствии с требованиями.

0 голосов
/ 11 октября 2018
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
0 голосов
/ 21 июля 2018

пожалуйста, проверьте ниже ---

select regexp_instr ('500 Oracle Parkway, Redwood Shores, CA', 'Apple|Park|Shores', 1, 1, 0, 'i') as result
from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...