Поиск подстроки

Функция

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

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

Варианты:

< синтаксис >::=
< подстрока >::=
< начало поиска >::=
< номер вхождения >::=
Общие правила
  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    |