Выделение подстроки
Функция
Выделение подстроки из заданной строки.
Спецификация
Варианты:
-
< выделение подстроки по шаблону >
::=
Общие правила
-
В качестве
< строки >
можно использовать выражения типа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); |56
select 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 |