PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

9.4. 字符串函数与操作符 #

9.4.1. format 格式化函数

本节介绍用于检测和处理字符串值的函数与操作符。此处讨论的字符串涵盖 character、character varying 以及 text 类型的值。除特别注明外,这些函数和操作符均声明为接受并返回 text 类型,且完全可互换地接受 character varying 参数。在应用函数或操作符之前,character 类型的值会被自动转换为 text,这会导致剔除 character 值末尾的任何填充空格。

SQL 标准定义了一批使用关键字而非逗号来分隔参数的字符串函数,详情见 Table 9.9。PostgreSQL 同样提供了使用常规函数调用语法的等价函数版本(参见 Table 9.10)。

Note

只要至少有一个输入为字符串类型,字符串连接操作符(||)便可接受非字符串输入(如 Table 9.9 所示)。在其他情况下,可以通过插入显式的 text 类型转换来拼接非字符串数据。

Table 9.9. 标准 SQL 字符串函数与操作符

函数/操作符

说明

示例

text || text → text

连接这两个字符串。

'Post' || 'greSQL' → PostgreSQL

text || anynonarray → text

anynonarray || text → text

把非字符串输入转换为文本, 然后连接这两个字符串。 (非字符串输入不能是数组类型, 因为那样会与数组的 || 操作符产生歧义。 如果你想连接一个数组的文本等价物, 请把它显式地转换为 text。)

'Value: ' || 42 → Value: 42

btrim ( string text [, characters text ] ) → text

从 string 的开头和结尾移除只包含 characters 中字符 (默认为空格) 的最长字符串。

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

text IS [NOT] [form] NORMALIZED → boolean

检查该字符串是否处于指定的 Unicode 规范化形式。 可选的 form 关键字指定该形式: NFC(默认值)、 NFD、 NFKC 或 NFKD。 只有当服务器编码为 UTF8 时才能使用这个表达式。 注意, 使用这个表达式检查规范化, 通常比把可能已经规范化的字符串再规范化一遍要快。

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

bit_length ( text ) → integer

返回字符串中的位数 (即 octet_length 的 8 倍)。

bit_length('jose') → 32

char_length ( text ) → integer

character_length ( text ) → integer

返回字符串中的字符数。

char_length('josé') → 4

lower ( text ) → text

按照数据库的区域设置规则, 把字符串转换为全部小写。

lower('TOM') → tom

lpad ( string text, length integer [, fill text ] ) → text

通过在 string 的前面添加字符 fill (默认为空格) 把它延长到 length 长度。 如果 string 已经长于 length, 它会被截断 (从右侧)。

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

ltrim ( string text [, characters text ] ) → text

从 string 的开头移除只包含 characters 中字符 (默认为空格) 的最长字符串。

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

normalize ( text [, form ] ) → text

把字符串转换为指定的 Unicode 规范化形式。 可选的 form 关键字指定该形式: NFC(默认值)、 NFD、 NFKC 或 NFKD。 只有当服务器编码为 UTF8 时才能使用这个函数。

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

octet_length ( text ) → integer

返回字符串中的字节数。

octet_length('josé') → 5 (如果服务器编码为 UTF8)

octet_length ( character ) → integer

返回字符串中的字节数。 由于这个版本的函数直接接受 character 类型, 它不会去除尾部的空格。

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

overlay ( string text PLACING newsubstring text FROM start integer [ FOR count integer ] ) → text

把 string 中从第 start 个字符开始、 延续 count 个字符的子串 替换为 newsubstring。 如果省略了 count, 它默认为 newsubstring 的长度。

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

position ( substring text IN string text ) → integer

返回指定的 substring 在 string 中的第一个起始索引, 如果不存在则返回零。

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

rpad ( string text, length integer [, fill text ] ) → text

通过在 string 的末尾添加字符 fill (默认为空格) 把它延长到 length 长度。 如果 string 已经长于 length, 它会被截断。

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

rtrim ( string text [, characters text ] ) → text

从 string 的结尾移除只包含 characters 中字符 (默认为空格) 的最长字符串。

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

substring ( string text [ FROM start integer ] [ FOR count integer ] ) → text

提取 string 的子串, 从第 start 个字符开始 (如果指定了的话), 并在 count 个字符之后停止 (如果指定了的话)。 至少要提供 start 和 count 中的一个。

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

substring('Thomas' from 3) → omas

substring('Thomas' for 2) → Th

substring ( string text FROM pattern text ) → text

提取匹配 POSIX 正则表达式的第一个子串; 参见 Section 9.7.3。

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

substring ( string text SIMILAR pattern text ESCAPE escape text ) → text

substring ( string text FROM pattern text FOR escape text ) → text

提取匹配 SQL 正则表达式的第一个子串; 参见 Section 9.7.2。 第一种形式从 SQL:2003 起就被规定了; 第二种形式只出现在 SQL:1999 中, 应当被视为过时。

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

trim ( [ LEADING | TRAILING | BOTH ] [ characters text ] FROM string text ) → text

从 string 的开头、 结尾或两端 (BOTH 是默认值) 移除只包含 characters 中字符 (默认为空格) 的最长字符串。

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

trim ( [ LEADING | TRAILING | BOTH ] [ FROM ] string text [, characters text ] ) → text

这是 trim() 的一种非标准语法。

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

unicode_assigned ( text ) → boolean

如果字符串中的所有字符都是已分配的 Unicode 码点, 则返回 true; 否则返回 false。 只有当服务器编码为 UTF8 时才能使用这个函数。

upper ( text ) → text

按照数据库的区域设置规则, 把字符串转换为全部大写。

upper('tom') → TOM


还有更多字符串操作函数和操作符可用, 它们列在 Table 9.10 中。 (其中一些在内部用于实现 Table 9.9 中列出的 SQL 标准字符串函数。) 还有模式匹配操作符, 它们在 Section 9.7 中描述; 全文检索的操作符则在 Chapter 12 中描述。

Table 9.10. 其他字符串函数与操作符

函数/操作符

说明

示例

text ^@ text → boolean

如果第一个字符串以第二个字符串开头, 则返回真 (等同于 starts_with() 函数)。

'alphabet' ^@ 'alph' → t

ascii ( text ) → integer

返回参数第一个字符的数字编码。 在 UTF8 编码中, 返回该字符的 Unicode 码点。 在其他多字节编码中, 参数必须是一个 ASCII 字符。

ascii('x') → 120

chr ( integer ) → text

返回具有给定编码的字符。 在 UTF8 编码中, 参数被视为一个 Unicode 码点。 在其他多字节编码中, 参数必须指定一个 ASCII 字符。 chr(0) 是不允许的, 因为文本数据类型无法存储那个字符。

chr(65) → A

concat ( val1 "any" [, val2 "any" [, ...] ] ) → text

把所有参数的文本表示串接起来。 NULL 参数会被忽略。

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

concat_ws ( sep text, val1 "any" [, val2 "any" [, ...] ] ) → text

用分隔符连接除第一个参数之外的所有参数。 第一个参数被用作分隔符字符串, 并且不应当是 NULL。 其他的 NULL 参数会被忽略。

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

format ( formatstr text [, formatarg "any" [, ...] ] ) → text

按照一个格式字符串对参数进行格式化; 参见 Section 9.4.1。 这个函数类似于 C 函数 sprintf。

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

initcap ( text ) → text

把每个单词的首字母转换为大写, 其余转换为小写。 单词是由非字母数字字符分隔的字母数字字符序列。

initcap('hi THOMAS') → Hi Thomas

casefold ( text ) → text

按照排序规则对输入字符串执行大小写折叠。 大小写折叠类似于大小写转换, 但大小写折叠的目的是便于对字符串进行不区分大小写的匹配, 而大小写转换的目的是转换为某个特定的大小写形式。 只有当服务器编码为 UTF8 时才能使用这个函数。

通常, 大小写折叠只是转换为小写, 但根据排序规则的不同可能存在例外。 例如, 某些字符有多于两个的小写变体, 或者折叠为大写。

大小写折叠可能改变字符串的长度。 例如, 在 PG_UNICODE_FAST 排序规则中, ß (U+00DF) 折叠为 ss。

casefold 可用于 Unicode 默认无大小写匹配。 它并不总是保留输入字符串的规范化形式 (参见 normalize)。

libc 提供者不支持大小写折叠, 因此 casefold 与 lower 相同。

left ( string text, n integer ) → text

返回字符串中前 n 个字符, 或者当 n 为负时, 返回除最后 |n| 个字符之外的所有字符。

left('abcde', 2) → ab

length ( text ) → integer

返回字符串中的字符数。

length('jose') → 4

md5 ( text ) → text

计算参数的 MD5 哈希, 结果以十六进制写出。

md5('abc') → 900150983cd24fb0​d6963f7d28e17f72

parse_ident ( qualified_identifier text [, strict_mode boolean DEFAULT true ] ) → text[]

把 qualified_identifier 拆分为一个标识符数组, 并去除各个标识符上的任何引号。 默认情况下, 最后一个标识符之后的额外字符被视为错误; 但如果第二个参数为 false, 那么这类额外字符会被忽略。 (这种行为对于解析诸如函数之类的对象的名字很有用。) 注意,这个函数不会截断超长标识符。 如果你想要截断, 可以把结果转换为 name[]。

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

pg_client_encoding ( ) → name

返回当前的客户端编码名。

pg_client_encoding() → UTF8

quote_ident ( text ) → text

把给定的字符串进行适当的加引号处理, 使它可以在一条 SQL 语句字符串中用作标识符。 只在必要时添加引号 (即如果该字符串包含非标识符字符, 或者会被大小写折叠)。 内嵌的引号会被正确地写成双引号。 另请参见 Example 41.1。

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

quote_literal ( text ) → text

把给定的字符串进行适当的加引号处理, 使它可以在一条 SQL 语句字符串中用作字符串字面量。 内嵌的单引号和反斜杠会被正确地写成双份。 注意, quote_literal 在输入为空时返回空; 如果参数可能为空, quote_nullable 通常更合适。 另请参见 Example 41.1。

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

quote_literal ( anyelement ) → text

把给定的值转换为文本, 然后把它作为字面量加引号。 内嵌的单引号和反斜杠会被正确地写成双份。

quote_literal(42.5) → '42.5'

quote_nullable ( text ) → text

把给定的字符串进行适当的加引号处理, 使它可以在一条 SQL 语句字符串中用作字符串字面量; 或者如果参数为空, 则返回 NULL。 内嵌的单引号和反斜杠会被正确地写成双份。 另请参见 Example 41.1。

quote_nullable(NULL) → NULL

quote_nullable ( anyelement ) → text

把给定的值转换为文本, 然后把它作为字面量加引号; 或者如果参数为空, 则返回 NULL。 内嵌的单引号和反斜杠会被正确地写成双份。

quote_nullable(42.5) → '42.5'

regexp_count ( string text, pattern text [, start integer [, flags text ] ] ) → integer

返回 POSIX 正则表达式 pattern 在 string 中匹配的次数; 参见 Section 9.7.3。

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

regexp_instr ( string text, pattern text [, start integer [, N integer [, endoption integer [, flags text [, subexpr integer ] ] ] ] ] ) → integer

返回 POSIX 正则表达式 pattern 的第 N 次匹配在 string 中出现的位置, 如果没有这样的匹配则返回零; 参见 Section 9.7.3。

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

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

regexp_like ( string text, pattern text [, flags text ] ) → boolean

检查 POSIX 正则表达式 pattern 的匹配是否出现在 string 内; 参见 Section 9.7.3。

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

regexp_match ( string text, pattern text [, flags text ] ) → text[]

返回 POSIX 正则表达式 pattern 与 string 的第一次匹配中的子串; 参见 Section 9.7.3。

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

regexp_matches ( string text, pattern text [, flags text ] ) → setof text[]

返回 POSIX 正则表达式 pattern 与 string 的第一次匹配中的子串, 或者如果使用了 g 标志, 则返回所有此类匹配中的子串; 参见 Section 9.7.3。

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

 {bar}
 {baz}

regexp_replace ( string text, pattern text, replacement text [, flags text ] ) → text

替换与 POSIX 正则表达式 pattern 的第一次匹配的子串, 或者如果使用了 g 标志, 则替换所有此类匹配; 参见 Section 9.7.3。

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

regexp_replace ( string text, pattern text, replacement text, start integer [, N integer [, flags text ] ] ) → text

把与 POSIX 正则表达式 pattern 的第 N 次匹配的子串 (如果 N 为零则所有此类匹配) 替换掉, 搜索从 string 的第 start 个字符开始。 如果省略了 N, 它默认为 1。 参见 Section 9.7.3。

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

regexp_replace(string=>'hello world', pattern=>'l', replacement=>'XX', start=>1, "N"=>2) → helXXo world

regexp_split_to_array ( string text, pattern text [, flags text ] ) → text[]

使用一个 POSIX 正则表达式作为分隔符来拆分 string, 产生一个结果数组; 参见 Section 9.7.3。

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

regexp_split_to_table ( string text, pattern text [, flags text ] ) → setof text

使用一个 POSIX 正则表达式作为分隔符来拆分 string, 产生一组结果; 参见 Section 9.7.3。

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

 hello
 world

regexp_substr ( string text, pattern text [, start integer [, N integer [, flags text [, subexpr integer ] ] ] ] ) → text

返回 string 中与 POSIX 正则表达式 pattern 的第 N 次出现相匹配的子串, 如果没有这样的匹配则返回 NULL; 参见 Section 9.7.3。

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

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

repeat ( string text, number integer ) → text

把 string 重复指定的 number 次。

repeat('Pg', 4) → PgPgPgPg

replace ( string text, from text, to text ) → text

把 string 中所有出现的子串 from 替换为子串 to。

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

reverse ( text ) → text

反转字符串中字符的顺序。

reverse('abcde') → edcba

right ( string text, n integer ) → text

返回字符串中最后 n 个字符, 或者当 n 为负时, 返回除最初 |n| 个字符之外的所有字符。

right('abcde', 2) → de

split_part ( string text, delimiter text, n integer ) → text

在 delimiter 出现的位置拆分 string, 并返回第 n 个字段 (从 1 开始计数), 或者当 n 为负时, 返回倒数第 |n| 个字段。

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

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

starts_with ( string text, prefix text ) → boolean

如果 string 以 prefix 开头, 则返回真。

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

string_to_array ( string text, delimiter text [, null_string text ] ) → text[]

在 delimiter 出现的位置拆分 string, 并把得到的字段组成一个 text 数组。 如果 delimiter 为 NULL, 那么 string 中的每个字符都会成为数组中一个单独的元素。 如果 delimiter 是一个空字符串, 那么 string 会被当作一个单一字段。 如果提供了 null_string 并且它不是 NULL, 那么与该字符串匹配的字段会被替换为 NULL。 另请参见 array_to_string。

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

string_to_table ( string text, delimiter text [, null_string text ] ) → setof text

在 delimiter 出现的位置拆分 string, 并把得到的字段作为一组 text 行返回。 如果 delimiter 为 NULL, 那么 string 中的每个字符都会成为结果中单独的一行。 如果 delimiter 是一个空字符串, 那么 string 会被当作一个单一字段。 如果提供了 null_string 并且它不是 NULL, 那么与该字符串匹配的字段会被替换为 NULL。

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

 xx
 NULL
 zz

strpos ( string text, substring text ) → integer

返回指定的 substring 在 string 中的第一个起始索引, 如果不存在则返回零。 (与 position(substring in string) 相同, 但注意参数顺序相反。)

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

substr ( string text, start integer [, count integer ] ) → text

提取 string 的子串, 从第 start 个字符开始, 如果指定了的话则延续 count 个字符。 (与 substring(string from start for count) 相同。)

substr('alphabet', 3) → phabet

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

to_ascii ( string text ) → text

to_ascii ( string text, encoding name ) → text

to_ascii ( string text, encoding integer ) → text

把 string 从另一种编码转换为 ASCII, 该编码可以通过名字或编号来指定。 如果省略了 encoding, 则假定使用数据库编码 (在实践中这是唯一有用的情形)。 这种转换主要是去除变音符号。 只有从 LATIN1、 LATIN2、 LATIN9 和 WIN1250 编码的转换才受支持。 (另一种更灵活的解决方案请参见 unaccent 模块。)

to_ascii('Karél') → Karel

to_bin ( integer ) → text

to_bin ( bigint ) → text

把该数字转换为它等价的二进制补码表示。

to_bin(2147483647) → 1111111111111111111111111111111

to_bin(-1234) → 11111111111111111111101100101110

to_hex ( integer ) → text

to_hex ( bigint ) → text

把该数字转换为它等价的十六进制补码表示。

to_hex(2147483647) → 7fffffff

to_hex(-1234) → fffffb2e

to_oct ( integer ) → text

to_oct ( bigint ) → text

把该数字转换为它等价的八进制补码表示。

to_oct(2147483647) → 17777777777

to_oct(-1234) → 37777775456

translate ( string text, from text, to text ) → text

把 string 中与 from 集合中的字符相匹配的每个字符, 替换为 to 集合中对应的字符。 如果 from 长于 to, 那么 from 中多余字符的出现会被删除。

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

unistr ( text ) → text

求值参数中的转义 Unicode 字符。 Unicode 字符可以被指定为 \XXXX (4 个十六进制数字)、 \+XXXXXX (6 个十六进制数字)、 \uXXXX (4 个十六进制数字) 或 \UXXXXXXXX (8 个十六进制数字)。 要指定一个反斜杠, 请写两个反斜杠。 所有其他字符都按字面处理。

如果服务器编码不是 UTF-8, 那么这些转义序列所标识的 Unicode 码点会被转换为实际的服务器编码; 如果不可能进行转换, 则会报告一个错误。

这个函数为带有 Unicode 转义的字符串常量提供了一种 (非标准的) 替代方案 (参见 Section 4.1.2.3)。

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

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


concat、 concat_ws 和 format 函数是可变参数的, 因此可以把要连接或格式化的值作为一个用 VARIADIC 关键字标记的数组传递 (参见 Section 36.5.6)。 数组的元素会被当作该函数的单独普通参数来对待。 如果可变参数数组参数为 NULL, concat 和 concat_ws 会返回 NULL, 但 format 会把 NULL 当作一个零元素数组。

另请参见 Section 9.21 中的聚集函数 string_agg, 以及 Table 9.13 中用于在字符串与 bytea 类型之间转换的函数。

9.4.1. format 格式化函数 #

函数 format 按照一个格式字符串产生格式化的输出, 其风格类似于 C 函数 sprintf。

format(formatstr text [, formatarg "any" [, ...] ])

formatstr 是一个格式字符串, 它规定结果应当如何被格式化。 格式字符串中的文本会被直接复制到结果中, 除非使用了 格式说明符。 格式说明符充当字符串中的占位符, 定义后续的函数参数应当如何被格式化并插入到结果中。 每个 formatarg 参数都会按照其数据类型的常规输出规则被转换为文本, 然后根据格式说明符被格式化并插入到结果字符串中。

格式说明符由一个 % 字符引入, 并具有

%[position][flags][width]type

的形式, 其中的组成部分字段是:

position(可选)

形如 n$ 的字符串, 其中 n 是要打印的参数的索引。 索引 1 表示 formatstr 之后的第一个参数。 如果省略了 position, 默认是按顺序使用下一个参数。

flags (optional)

控制格式说明符的输出如何被格式化的附加选项。 当前唯一受支持的标志是一个减号 (-), 它会让格式说明符的输出左对齐。 除非还指定了 width 字段, 否则它没有任何效果。

width (optional)

指定用于显示格式说明符输出的 最小字符数。 输出会根据需要在其左侧或右侧 (取决于 - 标志) 用空格填充以达到这个宽度。 过小的宽度不会导致输出被截断, 而只是被简单地忽略。 宽度可以用以下任何一种方式指定: 一个正整数; 一个星号 (*), 表示使用下一个函数参数作为宽度; 或者形如 *n$ 的字符串, 表示使用第 n 个函数参数作为宽度。

如果宽度来自一个函数参数, 那么该参数会在用于格式说明符取值的参数之前被消耗。 如果宽度参数为负, 那么结果会在一个长度为 abs(width) 的字段内左对齐 (就好像指定了 - 标志一样)。

type (required)

用于产生格式说明符输出的格式转换类型。 支持以下类型:

  • s 把参数值格式化为一个简单的字符串。 空值会被当作一个空字符串。

  • I 把参数值当作一个 SQL 标识符, 必要时给它加上双引号。 如果该值为空则是一个错误 (等同于 quote_ident)。

  • L 把参数值作为一个 SQL 字面量加引号。 空值会被显示为字符串 NULL, 不带引号 (等同于 quote_nullable)。

除了上面描述的格式说明符之外, 还可以使用特殊序列 %% 来输出一个字面上的 % 字符。

下面是基本格式转换的一些例子:

SELECT format('Hello %s', 'World');
Result: Hello World

SELECT format('Testing %s, %s, %s, %%', 'one', 'two', 'three');
Result: Testing one, two, three, %

SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
Result: INSERT INTO "Foo bar" VALUES('O''Reilly')

SELECT format('INSERT INTO %I VALUES(%L)', 'locations', 'C:\Program Files');
Result: INSERT INTO locations VALUES('C:\Program Files')

下面是使用 width 字段和 - 标志的例子:

SELECT format('|%10s|', 'foo');
Result: |       foo|

SELECT format('|%-10s|', 'foo');
Result: |foo       |

SELECT format('|%*s|', 10, 'foo');
Result: |       foo|

SELECT format('|%*s|', -10, 'foo');
Result: |foo       |

SELECT format('|%-*s|', 10, 'foo');
Result: |foo       |

SELECT format('|%-*s|', -10, 'foo');
Result: |foo       |

这些例子展示了 position 字段的使用:

SELECT format('Testing %3$s, %2$s, %1$s', 'one', 'two', 'three');
Result: Testing three, two, one

SELECT format('|%*2$s|', 'foo', 10, 'bar');
Result: |       bar|

SELECT format('|%1$*2$s|', 'foo', 10, 'bar');
Result: |       foo|

与标准的 C 函数 sprintf 不同, PostgreSQL 的 format 函数允许在同一格式字符串中混用带 position 字段和不带该字段的格式说明符。 一个不带 position 字段的格式说明符总是使用在最后一个被消耗的参数之后的下一个参数。 此外, format 函数不要求格式字符串中用到所有的函数参数。 例如:

SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
Result: Testing three, two, three

%I 和 %L 格式说明符对于安全地构造动态 SQL 语句特别有用。 参见 Example 41.1。