9.4. 字符串函数和运算符#
本节介绍用于检查和操作字符串值的函数和运算符。此上下文中的字符串包括类型character
、character varying
和text
的值。除非另有说明,否则这些函数和运算符声明为接受并返回类型text
。它们将可互换地接受character varying
参数。类型为character
的值将在应用函数或运算符之前转换为text
,从而去除character
值中的任何尾随空格。
SQL定义了一些字符串函数,它们使用关键字(而不是逗号)来分隔参数。详情请参见表 9.9。PostgreSQL还提供了使用常规函数调用语法(参见表 9.10)的这些函数的版本。
注意
字符串连接运算符 (||
) 将接受非字符串输入,只要至少一个输入为字符串类型,如表 9.9中所示。对于其他情况,可以插入显式强制转换为text
,以接受非字符串输入。
表 9.9。SQL字符串函数和运算符
函数/运算符 说明 示例 |
---|
连接两个字符串。
|
将非字符串输入转换为文本,然后连接两个字符串。(非字符串输入不能为数组类型,因为这会与数组
|
从
|
检查字符串是否为指定的 Unicode 规范化形式。可选的
|
返回字符串中的位数(
|
返回字符串中的字符数。
|
根据数据库区域设置的规则将字符串转换为全部小写。
|
通过在
|
从
|
将字符串转换为指定的 Unicode 规范化形式。可选的
|
返回字符串中的字节数。
|
返回字符串中的字节数。由于此版本的函数直接接受类型
|
用
|
返回指定
|
通过附加字符
|
从
|
提取
|
提取与 POSIX 正则表达式匹配的第一个子字符串;请参见 第 9.7.3 节。
|
提取与 正则表达式匹配的第一个子字符串;请参见 第 9.7.2 节。第一种形式已从 SQL:2003 开始指定;第二种形式仅在 SQL:1999 中,应被视为已过时。
|
从
|
这是
|
根据数据库区域设置的规则将字符串转换为全部大写。
|
其他字符串操作函数和运算符可用,并列于表 9.10中。(其中一些在内部用于实现表 9.9中列出的SQL标准字符串函数。)还有模式匹配运算符,在第 9.7 节中进行了描述,以及全文搜索运算符,在第 12 章中进行了描述。
表 9.10。其他字符串函数和运算符
函数/运算符 说明 示例 |
---|
如果第一个字符串以第二个字符串开头,则返回 true(等同于
|
返回参数第一个字符的数字代码。在 编码中,返回字符的 Unicode 代码点。在其他多字节编码中,参数必须是 字符。
|
返回具有给定代码的字符。在 编码中,参数被视为 Unicode 代码点。在其他多字节编码中,参数必须指定 字符。不允许使用
|
连接所有参数的文本表示形式。忽略 NULL 参数。
|
连接所有除第一个参数之外的参数,并用分隔符分隔。第一个参数用作分隔符字符串,不应为 NULL。其他 NULL 参数将被忽略。
|
根据格式字符串设置参数格式;请参见 第 9.4.1 节。此功能类似于 C 函数
|
将每个单词的首字母转换为大写,其余部分转换为小写。单词是由非字母数字字符分隔的字母数字字符序列。
|
返回字符串中前
|
返回字符串中的字符数。
|
计算参数的 MD5 哈希,结果以十六进制形式写入。
|
将
|
返回当前客户端编码名称。
|
返回给定的字符串,该字符串经过适当的引用,可用于 语句字符串中的标识符。仅在必要时才添加引号(即,如果字符串包含非标识符字符或会被折叠大小写)。嵌入式引号被正确地加倍。另请参见示例 43.1。
|
返回给定的字符串,该字符串经过适当的引用,可用于 语句字符串中的字符串文字。嵌入式单引号和反斜杠被正确地加倍。请注意,
|
将给定的值转换为文本,然后将其作为文字引用。嵌入式单引号和反斜杠被正确地加倍。
|
返回给定字符串,将其适当引用以用作 语句字符串中的字符串文字;或者,如果参数为 null,则返回
|
将给定值转换为文本,然后将其引用为文字;或者,如果参数为 null,则返回
|
返回 POSIX 正则表达式
|
返回
|
检查 POSIX 正则表达式
|
返回 POSIX 正则表达式
|
返回 POSIX 正则表达式
{bar} {baz} |
替换与 POSIX 正则表达式
|
替换与 POSIX 正则表达式
|
使用 POSIX 正则表达式作为分隔符拆分
|
使用 POSIX 正则表达式作为分隔符拆分
hello world |
返回
|
重复
|
用子字符串
|
反转字符串中的字符顺序。
|
返回字符串中最后的
|
在
|
如果
|
在
|
在
xx NULL zz |
返回指定
|
从
|
将
|
将数字转换为其等效的十六进制表示形式。
|
将
|
评估参数中转义的 Unicode 字符。Unicode 字符可指定为 如果服务器编码不是 UTF-8,则由这些转义序列之一标识的 Unicode 代码点将转换为实际的服务器编码;如果不可能,则会报告错误。 此函数提供了一个(非标准)的替代方案,用于带 Unicode 转义字符的字符串常量(请参见 第 4.1.2.3 节)。
|
函数concat
、concat_ws
和format
是可变参数的,因此可以将要连接或格式化的值作为用VARIADIC
关键字标记的数组传递(请参见第 38.5.6 节)。数组的元素被视为函数的单独普通参数。如果可变参数数组参数为 NULL,则concat
和concat_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
其中组件字段为
位置
(可选)格式为
的字符串,其中n
$n
是要打印的参数索引。索引 1 表示formatstr
之后的第一个参数。如果省略位置
,则默认使用序列中的下一个参数。标志
(可选)控制格式说明符输出格式的其他选项。目前唯一支持的标志是减号 (
-
),它将导致格式说明符的输出左对齐。除非还指定了宽度
字段,否则此标志无效。宽度
(可选)指定用于显示格式说明符输出的字符的最小数量。根据需要,在左侧或右侧(取决于
-
标志)用空格填充输出以填满宽度。宽度过小不会导致输出截断,而是会被忽略。可以使用以下任何方式指定宽度:正整数;星号 (*
) 将下一个函数参数用作宽度;或格式为*
的字符串,将第n
$n
个函数参数用作宽度。如果宽度来自函数参数,则在用于格式说明符值的参数之前使用该参数。如果宽度参数为负,则结果将在长度为
abs
(宽度
) 的字段中左对齐(就像指定了-
标志一样)。类型
(必需)用于生成格式说明符输出的格式转换类型。支持以下类型
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
字段的格式说明符。不带position
*字段的格式说明符始终使用最后一个参数消耗之后的下一个参数。此外,format
函数不要求在格式字符串中使用所有函数参数。例如
SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
Result: Testing three, two, three
%I
和%L
格式说明符对于安全地构造动态 SQL 语句特别有用。请参阅示例 43.1。