Строковые функции и операторы

В этом разделе описываются функции и операторы для проверки и манипулирования строковыми значениями. Строки в этом контексте включают значения типов character, character varying и text. Если не указано иное, эти функции и операторы объявляются принимающими и возвращающими тип text. Также они будут взаимозаменяемо принимать аргументы типа character varying. Значения типа character перед применением функции или оператора будут преобразовываться в text, в результате чего все завершающие пробелы в значении character будут обрезаться.

В SQL определены некоторые строковые функции, в которых для разделения аргументов вместо запятых используются ключевые слова. Подробнее эти слова описаны в подразделе Строковые функции и операторы SQL. QHB также предоставляет версии этих функций, использующие обычный синтаксис вызова функций (см. подраздел Другие строковые функции и операторы).

Примечание
Оператор конкатенации строк (||) примет нестроковый аргумент, если хотя бы один аргумент имеет строковый тип, как показано в подразделе Строковые функции и операторы SQL. В других случаях, чтобы оператор принял нестроковый аргумент, можно использовать явное преобразование в тип text.



Строковые функции и операторы SQL

text || text → text

Конкатенирует две строки.

'Quan' || 'tum' → Quantum

text || anynonarray → text

anynonarray || text → text

Преобразует нестроковый аргумент в текст, а затем конкатенирует две строки. (Нестроковый аргумент не может быть типом массива, поскольку это может вызвать неоднозначность с операторами || массивов. Если требуется конкатенировать эквивалент текста в массиве, следует явно привести его к типу text.)

'Value: ' || 42 → Value: 42

btrim

btrim ( строкаtext [,символы text ] ) → text

Удаляет самую длинную подстроку, содержащую только заданные символы (по умолчанию пробел), с начала и конца строки.

btrim('xyxtrimyyx', 'xyz') → trim

text IS NORMALIZED

text IS [NOT] [форма] NORMALIZED → boolean

Проверяет, соответствует ли строка определенной форме нормализации Unicode. Форма указывается в необязательном ключевом слове форма: NFC (по умолчанию), NFD, NFKC или NFKD. Это выражение можно использовать, только если кодировка сервера — UTF8. Обратите внимание, что проверка нормализации с помощью этого выражения зачастую бывает быстрее, чем нормализация уже, возможно, нормализованных строк.

U&'\0061\0308bc' IS NFD NORMALIZED → t

bit_length

bit_length ( text ) → integer

Возвращает количество битов в строке (это число в 8 раз больше octet_length).

bit_length('jose') → 32

char(acter)_length

char_length ( text ) → integer
character_length ( text ) → integer

Возвращает количество символов в строке.

char_length('josé') → 4

lower

lower ( text ) → text

Переводит символы строки в нижний регистр в соответствии с правилами локали базы данных.

lower('TOM') → tom

lpad

lpad ( строкаtext,длинаinteger [,заполнитель text ] ) → text

Расширяет строку до заданной длины, добавляя в начале символы- заполнители (по умолчанию пробел). Если строка уже длиннее заданной длины, она усекается (справа).

lpad('hi', 5, 'xy') → xyxhi

ltrim

ltrim ( строкаtext [,символы text ] ) → text

Удаляет самую длинную подстроку, содержащую только заданные символы (по умолчанию пробел), с начала строки.

ltrim('zzzytest', 'xyz') → test

normalize

normalize ( text [, форма ] ) → text

Преобразует строку в заданную форму нормализации Unicode. Форма указывается в необязательном ключевом слове форма: NFC (по умолчанию), NFD, NFKC или NFKD. Эту функцию можно использовать, только если кодировка сервера — UTF8.

normalize(U&'\0061\0308bc', NFC) → U&'\00E4bc'

octet_length

octet_length ( text ) → integer

Возвращает количество байтов в строке.

octet_length('josé') → 5

(если кодировка сервера — UTF8)

octet_length ( character ) → integer

Возвращает количество байтов в строке. Поскольку эта версия функции принимает непосредственно тип character, она не обрезает завершающие пробелы.

octet_length('abc '::character(4)) → 4

overlay

overlay ( строкаtext PLACINGновая_подстрокаtext FROMначалоinteger [ FORчисло integer ] ) → text

Заменяет в строке подстроку, начинающуюся с символа на позиции начало и длиной в заданное число символов, на новую_подстроку. Если число опущено, по умолчанию количество заменяемых символов определяется длиной новой_подстроки.

overlay('Txxxxas' placing 'hom' from 2 for 4) → Thomas

position

position ( подстрокаtext INстрока text ) → integer

Возвращает начальную позицию первого вхождения заданной подстроки в строке или ноль, если такого вхождения нет.

position('om' in 'Thomas') → 3

rpad

rpad ( строкаtext,длинаinteger [,заполнитель text ] ) → text

Расширяет строку до заданной длины, добавляя в конце символы- заполнители (по умолчанию пробел). Если строка уже длиннее заданной длины, она усекается.

rpad('hi', 5, 'xy') → hixyx

rtrim

rtrim ( строкаtext [,символы text ] ) → text

Удаляет самую длинную подстроку, содержащую только заданные символы (по умолчанию пробел), с конца строки.

rtrim('testxxzx', 'xyz') → test

substring

substring ( строкаtext [ FROMначалоinteger ] [ FORчисло integer ] ) → text

Извлекает из строки подстроку, начиная с символа на позиции начало (если таковая указана) и останавливаясь после заданного числа символов (если оно указано). Должен присутствовать хотя бы один из аргументов: начало или число.

substring('Thomas' from 2 for 3) → hom

substring('Thomas' from 3) → omas

substring('Thomas' for 2) → Th

substring ( строкаtext FROMшаблон text ) → text

Извлекает первую подстроку, соответствующую регулярному выражению POSIX; см. подраздел Регулярные выражения POSIX.

substring('Thomas' from '...$') → mas

substring ( строкаtext SIMILARшаблонtext ESCAPEуправляющая_последовательность text ) → text
substring ( строкаtext FROMшаблонtext FORуправляющая_последовательность text ) → text

Извлекает первую подстроку, соответствующую регулярному выражению SQL; см. подраздел Регулярные выражения SIMILAR TO. Первая форма была определена в стандарте, начиная с SQL:2003; вторая форма существовала только в стандарте SQL:1999, и ее следует считать устаревшей.

substring('Thomas' similar '%#"o_a#"_' escape '#') → oma

trim

trim ( [ LEADING | TRAILING | BOTH ] [ символыtext ] FROMстрока text ) → text

Удаляет самую длинную подстроку, содержащую только заданные символы (по умолчанию пробелы), с начала (LEADING), конца (TRAILING) или с обеих сторон (BOTH) строки (по умолчанию — BOTH).

trim(both 'xyz' from 'yxTomxx') → Tom

trim ( [ LEADING | TRAILING | BOTH ] [ FROM ] строкаtext [,символы text ] ) → text

Это нестандартный синтаксис для trim().

trim(both 'xyz' from 'yxTomxx') → Tom

upper

upper ( text ) → text

Переводит символы строки в верхний регистр в соответствии с правилами локали базы данных.

upper('tom') → TOM


Другие строковые функции и операторы

Существуют также дополнительные функции и операторы для работы со строками, перечисленные в этом подразделе. (Некоторые из них используются внутренне для реализации стандартных строковых функций SQL, перечисленных в подразделе Строковые функции и операторы SQL.) Кроме того, имеются операторы сопоставления шаблонов, описанные в разделе Сопоставление с шаблоном, и операторы для полнотекстового поиска, описанные в главе Полнотекстовый поиск.

text ^@ text → boolean

Возвращает true, если первая строка начинается со второй строки (равнозначно функции starts_with()).

'alphabet' ^@ 'alph' → t

ascii

ascii ( text ) → integer

Возвращает числовой код первого символа аргумента. В кодировке UTF8 возвращает код символа в Unicode. В других многобайтовых кодировках аргумент должен быть символом ASCII.

ascii('x') → 120

chr

chr ( integer ) → text

Возвращает символ с заданным кодом. В кодировке UTF8 аргумент воспринимается как код символа в Unicode. В других многобайтовых кодировках аргумент должен быть символом ASCII. Эта функция не может выдать chr(0), поскольку этот символ нельзя сохранить в текстовых типах данных.

chr(65) → A

concat

concat ( значение1"any" [,значение2 "any" [, ...] ] ) → text

Конкатенирует текстовые представления всех аргументов. Аргументы NULL игнорируются.

concat('abcde', 2, NULL, 22) → abcde222

concat_ws

concat_ws ( разделительtext,значение1"any" [,значение2 "any" [, ...] ] ) → text

Конкатенирует все аргументы (кроме первого) с разделителями. Первый аргумент используется как строка-разделитель и должен быть отличен от NULL. Другие аргументы NULL игнорируются.

concat_ws(',', 'abcde', 2, NULL, 22) → abcde,2,22

format

format ( строка_форматаtext [,форматируемые_аргументы "any" [, ...] ] ) → text

Форматирует аргументы в соответствии со строкой формата; см. подраздел Функция format. Эта функция схожа с функцией sprintf в языке C.

format('Hello %s, %1$s', 'World') → Hello World, World

initcap

initcap ( text ) → text

Переводит первую букву каждого слова в верхний регистр, а остальные — в нижний. Словами являются последовательности буквенно-цифровых символов, разделенных любыми отличными от них символами.

initcap('hi THOMAS') → Hi Thomas

left

left ( строкаtext,n integer ) → text

Возвращает первые n символов в строке или, если n — отрицательное число, возвращает все символы, кроме последних |n| символов.

left('abcde', 2) → ab

length

length ( text ) → integer

Возвращает количество символов в строке.

length('jose') → 4

md5

md5 ( text ) → text

Вычисляет MD5-хеш аргумента с результатом, написанным в шестнадцатеричном формате.

md5('abc') → 900150983cd24fb0​d6963f7d28e17f72

parse_ident

parse_ident ( полный_идентификаторtext [,строгий_режим boolean DEFAULT true ] ) → text[]

Разделяет полный_идентификатор на массив идентификаторов, удаляя кавычки вокруг отдельных идентификаторов. По умолчанию лишние символы после последнего идентификатора считаются ошибкой, но если установить второй параметр в false, то такие лишние символы игнорируются. (Это поведение полезно для синтаксического анализа имен таких объектов, как функции.) Обратите внимание, что эта функция не усекает чрезмерно длинные идентификаторы. Если есть необходимость в усеченных именах, можно привести результат к name[].

parse_ident('"SomeSchema".someTable') → {SomeSchema,sometable}

pg_client_encoding

pg_client_encoding ( ) → name

Возвращает имя текущей кодировки клиента.

pg_client_encoding() → UTF8

quote_ident

quote_ident ( text ) → text

Возвращает заданную строку, надлежащим образом подготовленную для использования в качестве идентификатора в строке оператора SQL. Кавычки добавляются только при необходимости (т. е. если строка содержит символы, недопустимые в идентификаторе, или буквы в разном регистре). Кавычки, уже содержащиеся в строке, дублируются. См. также пример Заключение в кавычки значений в динамических запросах.

quote_ident('Foo bar') → "Foo bar"

quote_literal

quote_literal ( text ) → text

Возвращает заданную строку, надлежащим образом подготовленную для использования в качестве строкового литерала в строке оператора SQL. Апострофы и обратные слэши, уже содержащиеся в строке, дублируются. Обратите внимание, что quote_literal возвращает NULL при входящем значении NULL; если аргумент может оказаться NULL, то зачастую лучше подойдет quote_nullable. См также пример Заключение в кавычки значений в динамических запросах.

quote_literal(E'O\'Reilly') → 'O''Reilly'

quote_literal ( anyelement ) → text

Преобразует заданное значение в текст, а затем заключает в апострофы как литерал. Апострофы и обратные слэши, уже содержащиеся в значении, дублируются.

quote_literal(42.5) → '42.5'

quote_nullable

quote_nullable ( text ) → text

Возвращает заданную строку, подходящим образом подготовленную для использования в качестве строкового литерала в строке оператора SQL, или, если аргумент NULL, возвращает NULL. Апострофы и обратные слэши, уже содержащиеся в строке, дублируются. См. также пример Заключение в кавычки значений в динамических запросах.

quote_nullable(NULL) → NULL

quote_nullable ( anyelement ) → text

Преобразует заданное значение в текст, а затем заключает в апострофы как литерал или, если аргумент NULL, возвращает NULL. Апострофы и обратные слэши, уже содержащиеся в значении, дублируются.

quote_nullable(42.5) → '42.5'

regexp_count

regexp_count ( строкаtext,шаблонtext [,началоinteger [,флаги text ]] ) → integer

Возвращает количество вхождений шаблона регулярного выражения POSIX в строке; см. подраздел Регулярные выражения POSIX.

regexp_count('123456789012', '\d\d\d', 2) → 3

regexp_instr

regexp_instr ( строкаtext,шаблонtext [,началоinteger [,Ninteger [,выбор_концаinteger [,флагиtext [,подвыражение integer ] ] ] ] ] ) → integer

Возвращает позицию в строке, где находится N-е вхождение шаблона регулярного выражения POSIX, или ноль, если такого вхождения нет; см. подраздел Регулярные выражения POSIX.

regexp_instr('ABCDEF', 'c(.)(..)', 1, 1, 0, 'i') → 3

regexp_instr('ABCDEF', 'c(.)(..)', 1, 1, 0, 'i', 2) → 5

regexp_like

regexp_like ( строкаtext,шаблонtext [,флаги text ] ) → boolean

Проверяет, имеется ли в строке вхождение шаблона регулярного выражения POSIX; см. подраздел Регулярные выражения POSIX.

regexp_like('Hello World', 'world$', 'i') → t

regexp_match

regexp_match ( строкаtext,шаблонtext [,флаги text ] ) → text[]

Возвращает подстроки из первого вхождения шаблона регулярного выражения POSIX в строке; см. подраздел Регулярные выражения POSIX.

regexp_match('foobarbequebaz', '(bar)(beque)') → {bar,beque}

regexp_matches

regexp_matches ( строкаtext,шаблонtext [,флаги text ] ) → setof text[]

Возвращает подстроки из первого вхождения шаблона регулярного выражения POSIX в строке или из всех таких вхождений, если используется флаг g; см. подраздел Регулярные выражения POSIX.

regexp_matches('foobarbequebaz', 'ba.', 'g') →

     {bar}
     {baz}

regexp_replace

regexp_replace ( строкаtext,шаблонtext,заменаtext [,началоinteger ] [,флаги text ] ) → text

Заменяет подстроку, являющуюся первым вхождением шаблона регулярного выражения POSIX, или все такие вхождения, если используется флаг g; см. подраздел Регулярные выражения POSIX.

regexp_replace('Thomas', '.[mN]a.', 'M') → ThM

regexp_replace ( строкаtext,шаблонtext,заменаtext,началоinteger,Ninteger [,флаги text ] ) → text

Заменяет подстроку, являющуюся N-м вхождением шаблона регулярного выражения POSIX, или все такие вхождения, если N равен нулю; см. подраздел Регулярные выражения POSIX.

regexp_replace('Thomas', '.', 'X', 3, 2) → ThoXas

regexp_split_to_array

regexp_split_to_array ( строкаtext,шаблонtext [,флаги text ] ) → text[]

Разделяет строку, используя в качестве разделителя регулярное выражение POSIX и выдавая массив результатов; см. подраздел Регулярные выражения POSIX.

regexp_split_to_array('hello world', '\s+') → {hello,world}

regexp_split_to_table

regexp_split_to_table ( строкаtext,шаблонtext [,флаги text ] ) → setof text

Разделяет строку, используя в качестве разделителя регулярное выражение POSIX и выдавая набор результатов; см. подраздел Регулярные выражения POSIX.

regexp_split_to_table('hello world', '\s+') →

     hello
     world

regexp_substr

regexp_substr ( строкаtext,шаблонtext [,началоinteger [,Ninteger [,флагиtext [,подвыражение integer ] ] ] ] ) → text

Возвращает подстроку в строке, соответствующую N-му вхождению шаблона регулярного выражения POSIX, или NULL, если такого вхождения нет; см. подраздел Регулярные выражения POSIX.

regexp_substr('ABCDEF', 'c(.)(..)', 1, 1, 'i') → CDEF

regexp_substr('ABCDEF', 'c(.)(..)', 1, 1, 'i', 2) → EF

repeat

repeat ( строкаtext,число integer ) → text

Повторяет строку заданное число раз.

repeat('Pg', 4) → PgPgPgPg

replace

replace ( строкаtext,цельtext,подстановка text ) → text

Заменяет все вхождения в строке подстроки цель подстрокой подстановка.

replace('abcdefabcdef', 'cd', 'XX') → abXXefabXXef

reverse

reverse ( text ) → text

Переставляет символы в строке в обратном порядке.

reverse('abcde') → edcba

right

right ( строкаtext,n integer ) → text

Возвращает последние n символов в строке или, если n — отрицательное число, возвращает все символы, кроме первых |n| символов.

right('abcde', 2) → de

split_part

split_part ( строкаtext,разделительtext,n integer ) → text

Разделяет строку по разделителю и возвращает n-ое поле (считая с первого) или, если n — отрицательное число, возвращает |n|-ое поле с конца.

split_part('abc~@~def~@~ghi', '~@~', 2) → def

split_part('abc,def,ghi,jkl', ',', -2) → ghi

starts_with

starts_with ( строкаtext,префикс text ) → boolean

Возвращает true, если строка начинается с префикса.

starts_with('alphabet', 'alph') → t

string_to_array

string_to_array ( строкаtext,разделительtext [,нулевая_строка text ] ) → text[]

Разделяет строку по разделителю и формирует из результирующих полей массив типа text. Если разделитель равен NULL, каждый символ в строке станет отдельным элементом массива. Если разделителем является пустая строка, то строка воспринимается как одно поле. Если предоставлена нулевая_строка и она отлична от NULL, поля, соответствующие этой строке, заменяются значениями NULL. См. также array_to_string.

string_to_array('xx~yy~zz', '~', 'yy') → {xx,NULL,zz}

string_to_table

string_to_table ( строкаtext,разделительtext [,нулевая_строка text ] ) → setof text

Разделяет строку по разделителю и возвращает результирующие поля в виде набора строк типа text. Если разделитель равен NULL, каждый символ в строке станет отдельной строкой результата. Если разделителем является пустая строка, то строка воспринимается как одно поле. Если предоставлена нулевая_строка и она отлична от NULL, поля, соответствующие этой строке, заменяются значениями NULL.

string_to_table('xx~^~yy~^~zz', '~^~', 'yy') →

    xx
    NULL
    zz

strpos

strpos ( строкаtext,подстрока text ) → integer

Возвращает начальную позицию первого вхождения заданной подстроки в строке или ноль, если такого вхождения нет. (То же, что и функция position(подстрока in строка), но обратите внимание на обратный порядок аргументов.)

strpos('high', 'ig') → 2

substr

substr ( строкаtext,началоinteger [,число integer ] ) → text

Извлекает из строки подстроку, начинающуюся с символа на позиции начало и длиной в заданное число символов, если оно указано. (То же, что и функция substring(строка from начало for число).)

substr('alphabet', 3) → phabet

substr('alphabet', 3, 2) → ph

to_ascii

to_ascii ( строка text ) → text
to_ascii ( строкаtext,кодировка name ) → text
to_ascii ( строкаtext,кодировка integer ) → text

Преобразует строку в ASCII из другой кодировки, которая может задаваться по имени или по номеру. Если кодировка опущена, подразумевается кодировка базы данных (что на практике является единственным полезным вариантом). В основном преобразование сводится к отбрасыванию диакритических знаков. Преобразование поддерживается только из кодировок LATIN1, LATIN2, LATIN9 и WIN1250. (Другое, более гибкое, решение реализовано в модуле unaccent.)

to_ascii('Karél') → Karel

to_hex

to_hex ( integer ) → text
to_hex ( bigint ) → text

Преобразует число в равнозначное ему шестнадцатеричное представление.

to_hex(2147483647) → 7fffffff

translate

translate ( строкаtext,цельtext,подстановка text ) → text

Заменяет каждый символ в строке, совпадающий с символом из множества цель, на соответствующий символ в множестве подстановка. Если цель длиннее подстановки, вхождения лишних символов цели удаляются.

translate('12345', '143', 'ax') → a2x5

unistr

unistr ( text ) → text

Вычисляет управляющие символы Unicode в аргументе. Символы Unicode можно задать в виде \XXXX (4 шестнадцатеричные цифры), \+XXXXXX (6 шестнадцатеричных цифр), \uXXXX (4 шестнадцатеричные цифры) или \UXXXXXXXX (8 шестнадцатеричных цифр). Чтобы указать обратный слэш, нужно написать два обратных слэша. Все остальные символы берутся буквально.

Если кодировка сервера не UTF-8, символ с кодом Unicode, заданный одной из этих управляющих последовательностей, преобразуется в фактическую кодировку сервера; если это невозможно, выдается ошибка.

Эта функция предоставляет (нестандартную) альтернативу строковым константам с управляющими последовательностями Unicode (см. подраздел Строковые константы с управляющими последовательностями Unicode).

unistr('d\0061t\+000061') → data

unistr('d\u0061t\U00000061') → data

Примечания

Функции concat, concat_ws и format принимают переменное число аргументов, поэтому им можно передавать значения для конкатенирования или форматирования в виде массива, помеченного ключевым словом VARIADIC (см. подраздел Функции SQL с переменным числом аргументов). Элементы такого массива обрабатываются так, как если бы они были отдельными обычными аргументами функции. Если вместо массива в аргументе передается NULL, функции concat и concat_ws возвращают NULL, а format воспринимает NULL как массив с нулевым элементом.

Также обратите внимание на агрегатную функцию string_agg в разделе Агрегатные функции и функции для преобразования текста в bytea и наоборот в подразделе Функции для преобразования текстовых/двоичных строк.



Функция format

Функция format создает выходные данные, отформатированные в соответствии со строкой формата, в стиле аналогичном функции C sprintf.

format(строка_формата text [, форматируемые_аргументы "any" [, ...] ])

Аргумент строка_формата определяет, как результат должен быть отформатирован. Текст в строке формата копируется непосредственно в результат, кроме случаев, когда используются спецификаторы формата. Спецификаторы формата действуют как заполнители в строке, определяя, как именно последующие аргументы функции должны быть отформатированы и вставлены в результат. Каждый форматируемый_аргумент преобразуется в текст в соответствии с обычными правилами вывода для его типа данных, а затем форматируется и вставляется в результирующую строку в соответствии со спецификаторами формата.

Спецификаторы формата вводятся символом % и имеют форму

%[позиция][флаги][ширина]тип

где полями компонентов являются:

позиция (необязательный)
Строка вида n$, где n — индекс выводимого аргумента. Индекс, равный 1, означает первый аргумент после formatstr. Если позиция опущена, по умолчанию используется следующий аргумент в последовательности.

флаги (необязательный)
Дополнительные параметры, управляющие форматированием вывода спецификатора формата. В настоящее время единственным поддерживаемым флагом является знак минус (-), который приведет к выравниванию вывода спецификатора формата по левому краю. Этот флаг не имеет никакого эффекта, если не указано поле ширина.

ширина (необязательный)
Задает минимальное количество символов, которое будет использовано для отображения выходных данных спецификатора формата. Выходные данные дополняются слева или справа (в зависимости от флага -) пробелами, необходимыми для заполнения до заданной ширины. Слишком маленькая ширина не приводит к усечению вывода, а просто игнорируется. Ширину можно указать любым из следующих способов: положительным целым числом, звездочкой (*) для использования в качестве ширины следующего аргумента функции или строкой вида *n$ для использования в качестве ширины n-го аргумента функции.
Если ширина берется из аргумента функции, этот аргумент задействуется раньше аргумента, используемого для значения спецификатора формата. Если аргумент ширины отрицательный, результат выравнивается по левому краю (как если бы был указан флаг -) в поле длиной abs(ширина).

тип (обязательный)
Тип преобразования формата, используемый для создания выходных данных спецификатора формата. Поддерживаются следующие типы:

  • s форматирует значение аргумента как простую строку. Значение NULL рассматривается как пустая строка.
  • I обрабатывает значение аргумента как идентификатор SQL, при необходимости заключая его в кавычки. Здесь значение NULL является ошибкой (так же, как и для quote_ident).
  • L заключает значение аргумента в апострофы, как литерал SQL. Значение NULL отображается в виде строки NULL, без кавычек (так же, как и у quote_nullable).

В дополнение к спецификаторам формата, описанным выше, для вывода буквального символа % можно использовать специальную последовательность %%.

Вот несколько примеров простых преобразований формата:

SELECT format('Hello% s', 'World');
Результат: Hello World

SELECT format('Testing %s, %s, %s, %%', 'one', 'two', 'three');
Результат: Testing one, two, three, %

SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
Результат: INSERT INTO "Foo bar" VALUES('O''Reilly')

SELECT format('INSERT INTO %I VALUES(%L)', 'locations', 'C:\Program Files');
Результат: INSERT INTO locations VALUES('C:\Program Files')

Примеры использования полей ширины и флага -:

SELECT format('|%10s|', 'foo');
Результат: |       foo|

SELECT format('|%-10s|', 'foo');
Результат: |foo       |

SELECT format('|%*s|', 10, 'foo');
Результат: |       foo|

SELECT format('|%*s|', -10, 'foo');
Результат: |foo       |

SELECT format('|%-*s|', 10, 'foo');
Результат: |foo       |

SELECT format('|%-*s|', -10, 'foo');
Результат: |foo       |

Эти примеры показывают использование полей позиции:

SELECT format('Testing %3$s, %2$s, %1$s', 'one', 'two', 'three');
Результат: Testing three, two, one

SELECT format('|%*2$s|', 'foo', 10, 'bar');
Результат: |       bar|

SELECT format('|%1$*2$s|', 'foo', 10, 'bar');
Результат: |       foo|

В отличие от стандартной функции C sprintf, функция format в QHB позволяет сочетать в одной строке формата спецификаторы формата с полями позиции и без них. Спецификатор формата без поля позиции всегда использует следующий аргумент после последнего задействованного аргумента. Кроме того, функция format не требует использования в строке формата всех аргументов функции. Например:

SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
Результат: Testing three, two, three

Спецификаторы формата %I и %L особенно полезны для безопасного построения динамических операторов SQL. См. пример Заключение в кавычки значений в динамических запросах.