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

Функция

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

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

Варианты:

  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-символа задан символ "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. Все аргументы функции могут быть заданы , который должен содержать спецификацию типа данных параметра.

    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     |