Поиск подстроки (INSTR/POSITION)

Функция

Поиск подстроки в заданной строке.

Спецификация
   

Варианты:

<​синтаксис​>::=
<​подстрока​>::=
<​начало поиска​>::=
<​номер вхождения​>::=
Общие правила
  1. <​Символьное выражение​> в аргументе может иметь следующие типы данных: CHAR, VARCHAR, NCHAR, NCHAR VARYING.

  2. Типы данных <​строки​> и <​подстроки​> должны быть приводимыми.

  3. Длина <​подстроки​> не должна быть более 4000.

  4. <​Начало поиска​> задает начальную позицию для поиска <​подстроки​>. Отсчет начинается с единицы. Если <​начало поиска​> не задано, по умолчанию принимается значение 1.

  5. <​Номер вхождения​> задает порядковый номер искомой подстроки. Отсчет начинается с единицы. Если <​номер вхождения​> не задан, по умолчанию принимается значение 1.

  6. <​Числовое выражение​> в <​начале поиска​> или в <​номере вхождения​> должно иметь целый тип или приводиться к нему.

  7. Функция POSITION эквивалента функции INSTR (<​строка​>,<​подстрока​>,1,1) или INSTR (<​строка​>,<​подстрока​>).

    select
    position('БД' in 'СУБД ЛИНТЕР'),
    instr('СУБД ЛИНТЕР','БД',1,1),
    instr('СУБД ЛИНТЕР','БД');
    | 3 | 3 | 3 |
  8. Выполняется поиск подстроки в строке, начиная с заданной позиции и с учетом указанного номера вхождения.

  9. Информация о недопустимых значениях входных параметров не возвращается.

  10. Все аргументы функции могут быть задано <​SQL-параметром​>, который должен содержать спецификацию типа данных параметра.

    select instr(? (varchar(50)), ? (varchar(10)), ? (int), ? (int));
    Мы едем, едем, едем в далёкие края
    едем
    5
    2
    | 16|
Возвращаемое значение
  1. Номер позиции, с которой размещается найденная в <​строке​> заданная <​подстрока​>.

  2. 0, если <​строка​> имеет нулевую длину, если подстрока не найдена, или входные параметры имеют логически недопустимые значения.

  3. NULL-значение, если длина <​подстроки​> равна 0.

  4. Тип возвращаемого значения – INT.

Примеры
select rownum,rtrim(firstnam)+' '+ltrim(name) from person
 where instr(firstnam,'EDWARD')<​​>0 order by name;
| 1 | EDWARD KING    |
| 2 | EDWARD TRAVIS  |
| 3 | EDWARD WOOLSEY |
| 4 | EDWARD WYLLIS  |
select phone,rtrim(firstnam)+' '+ltrim(name) from person
 where instr(phone,'99',4,2)<​​>0 order by name;
| 257-9999 |  | BILL SPIEGEL   |
| 713-9996 |  | GERALD SPIEGEL |
create table tab1 (i int, d dec, c char(5));
create table tab2 (vc varchar(10));
insert into tab1 values(0,2.7,'12345');
insert into tab1 values(-3,1.2, '59202');
insert into tab2 values('ab23cd3456');
insert into tab2 values('cda4978ee5');

select vc,
       c,
       d,
       abs(i+2) as "abs(i+2)",
       substr(c,d, abs(i+2)) as "substr",
       instr(vc,substr(c,d,abs(i+2))) as "instr"
  from tab1,tab2;
| VC         | C     | D   | abs(i+2)| substr | instr |
| ab23cd3456 | 12345 | 2.7 | 2       | 23     | 3     |
| cda4978ee5 | 12345 | 2.7 | 2       | 23     | 0     |
| ab23cd3456 | 59202 | 1.2 | 1       | 5      | 9     |
| cda4978ee5 | 59202 | 1.2 | 1       | 5      | 10    |