Позиционный SUBSTRING
В простой позиционной форме (с FROM
) эта функция возвращает подстроку, начинающуюся с позиции символа startpos (позиция первого сивола равна 1). Без аргумента FOR
он возвращает все оставшиеся символы в строке.С использованием FOR возвращается length символов или остаток строки, в зависимости от того что короче.
Начиная с Firebird 4.0, startpos может быть меньше 1.Когда startpos меньше 1, подстрока ведет себя так, как если бы строка имела дополнительные позиции 1 - startpos
передфактическим первым символом в позиции 1
.Значение length считается от этого воображаемого начала строки, поэтому результирующая строка может быть короче указанной length или даже пустой.
Функция полностью поддерживает двоичные и текстовые BLOB любой длины и с любым набором символов.Если параметр str имеет тип BLOB
, то и результат будет иметь тип BLOB
.Для любых других типов результатом будет тип VARCHAR
.
Для входного параметра str, не являющегося BLOB
, длина результата функции всегда будет равна длине строки str, независимо от значений параметров startpos и length.
SUBSTRING
select substring('abcdef' from 1 for 2) from rdb$database;
-- результат: 'ab'
select substring('abcdef' from 2) from rdb$database;
-- результат: 'bcdef'
select substring('abcdef' from 0 for 2) from rdb$database;
-- результат: 'a'
-- не 'ab', потому что в позиции 0 нет "ничего"
select substring('abcdef' from -5 for 2) from rdb$database;
-- результат: ''
-- длина заканчивается до фактического начала строки
SUBSTRING
по регулярному выражению
Функция SUBSTRING
с регулярным выражением (с SIMILAR
) возвращает часть строки соответствующей шаблону регулярного выражения SQL.Если соответствия не найдено, то возвращается NULL
.
Шаблон SIMILAR
формируется из трех шаблонов регулярных выражений SQL: R1, R2 и R3.Полностью шаблон имеет форму R1 || '<escape>"' || R2 || '<escape>"' || R3
, где <escape> — это escape-символ, определенный в предложении ESCAPE
.R2 — это шаблон, который соответствует подстроке для извлечения и заключен в экранированные двойные кавычки (<escape>"
, например, “#"
” с escape-символом ‘#
’). R1 соответствует префиксу строки, а R3 — суффиксу строки.И R1, и R3 необязательны (они могут быть пустыми), но шаблон должен соответствовать всей строке.Другими словами, недостаточно указать шаблон, который находит только подстроку для извлечения.
Tip
|
Экранированные двойные кавычки вокруг R2 можно сравнить с определением одной группы захвата в более распространенном синтаксисе регулярных выражений, таком как PCRE.То есть полный шаблон эквивалентен Возвращаемое значение соответствует части R2 регулярного выражения.Для этого значения истинно выражение
|
Note
|
Если любая часть шаблона из R1, R2 или R3 не является пустой строкой и не имеет формата регулярного выражения SQL, возникает исключение. |
Полный формат регулярных выражений SQL описан в Синтаксис регулярных выражений SQL.
SUBSTRING
с регулярными выражениямиSUBSTRING('abcabc' SIMILAR 'a#"bcab#"c' ESCAPE '#') -- bcab
SUBSTRING('abcabc' SIMILAR 'a#"%#"c' ESCAPE '#') -- bcab
SUBSTRING('abcabc' SIMILAR '_#"%#"_' ESCAPE '#') -- bcab
SUBSTRING('abcabc' SIMILAR '#"(abc)*#"' ESCAPE '#') -- abcabc
SUBSTRING('abcabc' SIMILAR '#"abc#"' ESCAPE '#') -- <null>