Выделение подстроки

Функция

Выделение подстроки из заданной строки.

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

Варианты:

  1. < синтаксис >::=
  2. < позиционное выделение подстроки >::=
    SUBSTRING (строка [{FROM|,} начало] [{FOR|,} длина])
Общие правила
  1. В качестве < строки > можно использовать выражения типа CHAR, VARCHAR, NCHAR, NCHAR VARYING.

  2. < Длина > подстроки должна задаваться в диапазоне от 0 до N, где N = length(< строка >) - < начало > + 1.

  3. Формат < шаблона > регулярных выражений описан в пункте «Предикат сопоставления».

  4. В вариантах 1 и 2 из < строки > выбирается подстрока заданной < длины >, начиная с позиции < начало >.

  5. Если опция [FROM |, < начало >] не задана, по умолчанию принимается FROM 1. При этом обязательно должно использоваться ключевое слово FOR.

    select substring('testing' for 4);
    |test|
  6. Если < длина > не задана, конечная позиция выбираемой подстроки определяется как максимум из двух значений: < начало > и длина < строки >.

  7. Если < начало > больше длины < строки >, или вычисленная конечная позиция меньше 1, возвращается пустая строка.

    Длина подстроки не задана:

    select substring('123456', 5);
    |56
    select substring('123456', 10);
    |          |

    Позиция < начала > больше длины < строки >:

    select length(substring('123456', 8.2));
    |          0|

    Конечная позиция меньше 1:

    select length(substring('123456', 2,-5));
    |          0|
  8. По умолчанию подстрока выбирается с позиции < начало > до конца исходной строки.

    select substring('testing' from 3), substring('testing', 3);
    | sting | sting |
    select substring(cast 123456 as char(6), 4);
    | 456 |
  9. Не целочисленное значение параметров < начало > и < длина > усекается до целого значения.

    select substring('123456', 5.7);
    |56|

    Конструкция

    select substr(model, 3, 4) from auto;

    и

    select substring(model from 3 for 4) from auto;

    эквивалентны.

    | RCUR |
    | 310  |
    | TADO |
      …
  10. Если < длина > не задана, то конечная длина подстроки определяется как максимум из двух значений: < начало > и длина < строки > (в случае типа данных VARCHAR конечным считается последний фактический символ).

    select substr(model, 3) from auto;
    | RCURY COMET GT V8 |
    | 310               |
    | TADOR STATION     |
    …
  11. Если < длина > равна 0, возвращается пустая строка.

  12. < ESC-символ > в обязательном аргументе функции задает разделитель шаблона регулярного выражения.

    Предположим, что в качестве ESC-символа задан символ "x".

    Тогда символьная строка, задаваемая во втором операнде, должна иметь вид '< рег1 >"рег2"рег3', где рег1, рег2 и рег3 являются регулярными выражениями.

    Функция пытается разделить < строку > на три раздела, первый из которых определяется путем сопоставления начала строки со строками, генерируемыми < рег1 >, второй – путем сопоставления оставшейся части < строки > с < рег2 >, и третий – путем сопоставления конца этой строки с < рег3 >.

    В случае отсутствия в < шаблоне > двух пар, состоящих из следующих друг за другом ESC-символа и '"', будет выдан код завершения 1125 («Неверный символ ESCAPE»).

    select substring('This image is nice' similar 'T%\"i[[:alpha:]]+e\"%is [[:alnum:]]+' escape '\');

    Результатом будет строка 'image'.

    select substring('This is string22' similar 'This is \"[[:ALPHA:]]+\"[[:DIGIT:]]+' escape '\');

    Результатом будет строка 'string'.

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

    select substr (? (char(20)), ? (int), ? (double));
    select substring (? (char(20)) from  ? (int) for ? (double));
    Тестовая строка
    10
    3.67
    |стр                 |

Возвращаемое значение
  1. Возвращается либо подстрока заданной < длины >, либо подстрока с символами от позиции < начала > до конца < строки >, дополненная справа пробелами до заданной < длины >.

  2. В случае использования регулярного выражения возвращается средняя часть < строки >.

  3. Если тип данных < строки > CHAR, тип результата CHAR.

  4. Если тип данных < строки > VARCHAR, тип результата VARCHAR.

  5. Если значение хотя бы одного из операндов не определено (NULL) или если < строка > не подходит по < шаблону >, возвращается NULL-значение.

  6. Если в качестве второго или третьего параметра указано отрицательное значение, возвращается код завершения 1036 - Значение аргумента в недопустимом диапазоне.

Пример
create table tab1 (c char(20));
insert into tab1 values(user);
insert into tab1 values('Систем');
select c,
       user as "user",
       substr(user, case instr(c, 'SYS') 
                      when 0 then 4
                      else instr(c, 'SYS') end ,2) as "substr"
  from tab1;

| C      | User   | Substr |
| SYSTEM | SYSTEM | SY     |
| Систем | SYSTEM | TE     |