2025年9月25日: PostgreSQL 18 发布!
支持版本:当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

9.4. 字符串函数和运算符 #

本节描述用于检查和操作字符串值的函数和运算符。此处的字符串包括 charactercharacter varyingtext 类型的值。除非另有说明,这些函数和运算符声明为接受并返回 text 类型。它们可以互换地接受 character varying 参数。类型为 character 的值在函数或运算符应用之前会转换为 text,这将导致 character 值中所有尾随空格被去除。

SQL定义了一些使用关键字而不是逗号来分隔参数的字符串函数。详情请参见表 9.9PostgreSQL 还提供了使用常规函数调用语法(参见表 9.10)的这些函数的版本。

注意

字符串连接运算符 (||) 将接受非字符串输入,只要至少有一个输入是字符串类型,如表 9.9所示。对于其他情况,插入显式强制转换为 text 可用于接受非字符串输入。

表 9.9. SQL字符串函数和运算符

函数/运算符

描述

示例

text || texttext

连接两个字符串。

'Post' || 'greSQL'PostgreSQL

text || anynonarraytext

anynonarray || texttext

将非字符串输入转换为文本,然后连接两个字符串。(非字符串输入不能是数组类型,因为那会与数组 || 运算符产生歧义。如果您想连接数组的文本等效项,请显式将其转换为 text。)

'Value: ' || 42Value: 42

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

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

btrim('xyxtrimyyx', 'xyz')trim

text IS [NOT] [form] NORMALIZEDboolean

检查字符串是否处于指定的 Unicode 规范化形式。可选的 form 关键字指定形式:NFC(默认)、NFDNFKCNFKD。此表达式只能在服务器编码为 UTF8 时使用。请注意,使用此表达式检查规范化通常比规范化可能已经规范化的字符串更快。

U&'\0061\0308bc' IS NFD NORMALIZEDt

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(默认)、NFDNFKCNFKD。此函数只能在服务器编码为 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

返回指定 substringstring 中第一次出现的起始索引,如果不存在则返回零。

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,则从第 start 个字符开始,如果指定了 count,则在 count 个字符后停止。至少提供 startcount 中的一个。

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 正则表达式匹配的第一个子字符串;参见第 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正则表达式;参见第 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


还有其他字符串操作函数和运算符,列在表 9.10中。(其中一些在内部用于实现SQL-标准字符串函数,列在表 9.9中。)还有模式匹配运算符,在第 9.7 节中描述,以及用于全文搜索的运算符,在第 12 章中描述。

表 9.10. 其他字符串函数和运算符

函数/运算符

描述

示例

text ^@ textboolean

如果第一个字符串以第二个字符串开头,则返回 true(等效于 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

根据格式字符串格式化参数;参见第 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 提供程序不支持大小写折叠,因此 casefoldlower 相同。

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语句字符串中用作标识符。仅在必要时(即,如果字符串包含非标识符字符或将被大小写折叠)才添加引号。嵌入的引号会正确地加倍。另请参见示例 41.1

quote_ident('Foo bar')"Foo bar"

quote_literal ( text ) → text

返回给定字符串,并适当引用,以便在SQL语句字符串中用作字符串文字。嵌入的单引号和反斜杠会正确地加倍。请注意,quote_literal 在空输入时返回空;如果参数可能为空,则 quote_nullable 通常更合适。另请参见示例 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。嵌入的单引号和反斜杠会正确地加倍。另请参见示例 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 正则表达式 patternstring 中匹配的次数;参见第 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 中的位置,如果不存在这样的匹配则返回零;参见第 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 中出现匹配;参见第 9.7.3 节

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

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

返回与 POSIX 正则表达式 patternstring 中的第一次匹配内的子字符串;参见第 9.7.3 节

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

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

返回 POSIX 正则表达式 patternstring 中的第一次匹配内的子字符串,如果使用了 g 标志,则返回所有此类匹配内的子字符串;参见第 9.7.3 节

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

 {bar}
 {baz}

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

替换与 POSIX 正则表达式 pattern 第一次匹配的子字符串,如果使用 g 标志,则替换所有此类匹配的子字符串;参见第 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。参见第 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,生成一个结果数组;参见第 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,生成一组结果;参见第 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;参见第 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 个字段(从一开始计数),当 n 为负数时,返回倒数第 |n| 个字段。

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

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

starts_with ( string text, prefix text ) → boolean

如果 stringprefix 开头,则返回 true。

starts_with('alphabet', 'alph')t

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

delimiter 出现的位置分割 string,并将结果字段组成一个 text 数组。如果 delimiterNULL,则 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 行返回。如果 delimiterNULL,则 string 中的每个字符都将成为结果的一个单独行。如果 delimiter 是一个空字符串,则 string 被视为单个字段。如果提供了 null_string 且不为 NULL,则与该字符串匹配的字段将被替换为 NULL

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

 xx
 NULL
 zz

strpos ( string text, substring text ) → integer

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

strpos('high', 'ig')2

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

提取 string 的子字符串,从第 start 个字符开始,如果指定了 count,则持续 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,则假定为数据库编码(实际上这是唯一有用的情况)。转换主要包括去除重音。仅支持从 LATIN1LATIN2LATIN9WIN1250 编码进行转换。(有关另一种更灵活的解决方案,请参见 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 集合中对应的字符。如果 fromto 长,则删除 from 中多余字符的出现。

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

unistr ( text ) → text

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

如果服务器编码不是 UTF-8,则由这些转义序列之一标识的 Unicode 代码点将转换为实际的服务器编码;如果无法转换,则报告错误。

此函数提供了字符串常量带 Unicode 转义序列的(非标准)替代方案(参见第 4.1.2.3 节)。

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

unistr('d\u0061t\U00000061')data


concatconcat_wsformat 函数是变长参数函数,因此可以将要连接或格式化的值作为标记有 VARIADIC 关键字的数组传递(参见第 36.5.6 节)。数组的元素被视为函数的独立普通参数。如果变长数组参数为 NULL,则 concatconcat_ws 返回 NULL,但 format 将 NULL 视为零元素数组。

另请参见第 9.21 节中的聚合函数 string_agg,以及表 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(可选)

控制格式说明符输出格式的其他选项。目前唯一支持的标志是负号 (-),它将导致格式说明符的输出左对齐。除非还指定了 width 字段,否则这无效。

width(可选)

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

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

type(必需)

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

  • s 将参数值格式化为简单字符串。NULL 值被视为空字符串。

  • I 将参数值视为 SQL 标识符,必要时加双引号。值为 NULL 是一个错误(等同于 quote_ident)。

  • L 将参数值作为 SQL 文字引用。NULL 值显示为字符串 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 不同,PostgreSQLformat 函数允许在同一格式字符串中混合使用带和不带 position 字段的格式说明符。不带 position 字段的格式说明符始终使用上次消耗参数之后的下一个参数。此外,format 函数不要求所有函数参数都在格式字符串中使用。例如

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

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

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。