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