Выделение подстроки (SUBSTR/SUBSTRING)
Функция
Выделение подстроки из заданной строки.
Спецификация
Варианты:
-
<выделение подстроки по шаблону>
::=
Общие правила
-
В качестве
<строки>можно использовать выражения типаCHAR,VARCHAR,NCHAR,NCHAR VARYING. -
<Длина>подстроки должна задаваться в диапазоне от 0 до N, гдеN = length(<строка>) - <начало> + 1. -
Формат
<шаблона>регулярных выражений описан в пункте «Предикат сопоставления». -
В вариантах 1 и 2 из
<строки>выбирается подстрока заданной<длины>, начиная с позиции<начало>. -
Если опция
[FROM |, <начало>]не задана, по умолчанию принимаетсяFROM 1. При этом обязательно должно использоваться ключевое словоFOR.select substring('testing' for 4); |test| -
Если
<длина>не задана, конечная позиция выбираемой подстроки определяется как максимум из двух значений:<начало>и длина<строки>. -
Если
<начало>больше длины<строки>, или вычисленная конечная позиция меньше 1, возвращается пустая строка.Длина подстроки не задана:
select substring('123456', 5); |56select substring('123456', 10); | |Позиция
<начала>больше длины<строки>:select length(substring('123456', 8.2)); | 0|Конечная позиция меньше 1:
select length(substring('123456', 2,-5)); | 0| -
По умолчанию подстрока выбирается с позиции
<начало>до конца исходной строки.select substring('testing' from 3), substring('testing', 3); | sting | sting |select substring(cast 123456 as char(6), 4); | 456 |
-
Не целочисленное значение параметров
<начало>и<длина>усекается до целого значения.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 | …
-
Если
<длина>не задана, то конечная длина подстроки определяется как максимум из двух значений:<начало>и длина<строки>(в случае типа данныхVARCHARконечным считается последний фактический символ).select substr(model, 3) from auto; | RCURY COMET GT V8 | | 310 | | TADOR STATION | …
-
Если
<длина>равна 0, возвращается пустая строка. -
<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'.
-
Все аргументы функции могут быть заданы
<SQL-параметром>, который должен содержать спецификацию типа данных параметра.select substr (? (char(20)), ? (int), ? (double)); select substring (? (char(20)) from ? (int) for ? (double)); Тестовая строка 10 3.67 |стр |
Возвращаемое значение
-
Возвращается либо подстрока заданной
<длины>, либо подстрока с символами от позиции<начала>до конца<строки>, дополненная справа пробелами до заданной<длины>. -
В случае использования регулярного выражения возвращается средняя часть
<строки>. -
Если тип данных
<строки> CHAR, тип результатаCHAR. -
Если тип данных
<строки> VARCHAR, тип результатаVARCHAR. -
Если значение хотя бы одного из операндов не определено (NULL) или если
<строка>не подходит по<шаблону>, возвращается NULL-значение. -
Если в качестве второго или третьего параметра указано отрицательное значение, возвращается код завершения 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 |