Выделение подстроки (SUBSTR/SUBSTRING)

Функция

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

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

Варианты:

  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     |