本节介绍用于检测和处理字符串值的函数与操作符。此处讨论的字符串涵盖 character、character varying 以及 text 类型的值。除特别注明外,这些函数和操作符均声明为接受并返回 text 类型,且完全可互换地接受 character varying 参数。在应用函数或操作符之前,character 类型的值会被自动转换为 text,这会导致剔除 character 值末尾的任何填充空格。
SQL 标准定义了一批使用关键字而非逗号来分隔参数的字符串函数,详情见 Table 9.9。PostgreSQL 同样提供了使用常规函数调用语法的等价函数版本(参见 Table 9.10)。
只要至少有一个输入为字符串类型,字符串连接操作符(||)便可接受非字符串输入(如 Table 9.9 所示)。在其他情况下,可以通过插入显式的 text 类型转换来拼接非字符串数据。
Table 9.9. 标准 SQL 字符串函数与操作符
函数/操作符 说明 示例 |
|---|
|
连接这两个字符串。
|
把非字符串输入转换为文本,
然后连接这两个字符串。
(非字符串输入不能是数组类型,
因为那样会与数组的
|
从
|
检查该字符串是否处于指定的 Unicode
规范化形式。
可选的
|
|
返回字符串中的位数
(即
|
返回字符串中的字符数。
|
|
按照数据库的区域设置规则, 把字符串转换为全部小写。
|
通过在
|
从
|
把字符串转换为指定的 Unicode
规范化形式。
可选的
|
返回字符串中的字节数。
|
返回字符串中的字节数。
由于这个版本的函数直接接受
|
把
|
返回指定的
|
通过在
|
从
|
提取
|
提取匹配 POSIX 正则表达式的第一个子串; 参见 Section 9.7.3。
|
提取匹配 SQL 正则表达式的第一个子串; 参见 Section 9.7.2。 第一种形式从 SQL:2003 起就被规定了; 第二种形式只出现在 SQL:1999 中, 应当被视为过时。
|
从
|
这是
|
如果字符串中的所有字符都是已分配的 Unicode
码点,
则返回
|
|
按照数据库的区域设置规则, 把字符串转换为全部大写。
|
还有更多字符串操作函数和操作符可用, 它们列在 Table 9.10 中。 (其中一些在内部用于实现 Table 9.9 中列出的 SQL 标准字符串函数。) 还有模式匹配操作符, 它们在 Section 9.7 中描述; 全文检索的操作符则在 Chapter 12 中描述。
Table 9.10. 其他字符串函数与操作符
函数/操作符 说明 示例 |
|---|
|
如果第一个字符串以第二个字符串开头,
则返回真
(等同于
|
|
返回参数第一个字符的数字编码。 在 UTF8 编码中, 返回该字符的 Unicode 码点。 在其他多字节编码中, 参数必须是一个 ASCII 字符。
|
|
返回具有给定编码的字符。
在 UTF8
编码中,
参数被视为一个 Unicode
码点。
在其他多字节编码中,
参数必须指定一个
ASCII
字符。
|
把所有参数的文本表示串接起来。 NULL 参数会被忽略。
|
用分隔符连接除第一个参数之外的所有参数。 第一个参数被用作分隔符字符串, 并且不应当是 NULL。 其他的 NULL 参数会被忽略。
|
按照一个格式字符串对参数进行格式化;
参见
Section 9.4.1。
这个函数类似于 C
函数
|
|
把每个单词的首字母转换为大写, 其余转换为小写。 单词是由非字母数字字符分隔的字母数字字符序列。
|
|
按照排序规则对输入字符串执行大小写折叠。
大小写折叠类似于大小写转换,
但大小写折叠的目的是便于对字符串进行不区分大小写的匹配,
而大小写转换的目的是转换为某个特定的大小写形式。
只有当服务器编码为
通常, 大小写折叠只是转换为小写, 但根据排序规则的不同可能存在例外。 例如, 某些字符有多于两个的小写变体, 或者折叠为大写。
大小写折叠可能改变字符串的长度。
例如,
在
|
返回字符串中前
|
|
返回字符串中的字符数。
|
|
计算参数的 MD5 哈希, 结果以十六进制写出。
|
把
|
|
返回当前的客户端编码名。
|
|
把给定的字符串进行适当的加引号处理, 使它可以在一条 SQL 语句字符串中用作标识符。 只在必要时添加引号 (即如果该字符串包含非标识符字符, 或者会被大小写折叠)。 内嵌的引号会被正确地写成双引号。 另请参见 Example 41.1。
|
|
把给定的字符串进行适当的加引号处理,
使它可以在一条
SQL
语句字符串中用作字符串字面量。
内嵌的单引号和反斜杠会被正确地写成双份。
注意,
|
把给定的值转换为文本, 然后把它作为字面量加引号。 内嵌的单引号和反斜杠会被正确地写成双份。
|
把给定的字符串进行适当的加引号处理,
使它可以在一条
SQL
语句字符串中用作字符串字面量;
或者如果参数为空,
则返回
|
把给定的值转换为文本,
然后把它作为字面量加引号;
或者如果参数为空,
则返回
|
返回 POSIX 正则表达式
|
返回 POSIX 正则表达式
|
检查 POSIX 正则表达式
|
返回 POSIX 正则表达式
|
返回 POSIX 正则表达式
{bar}
{baz}
|
替换与 POSIX 正则表达式
|
把与 POSIX 正则表达式
|
使用一个 POSIX 正则表达式作为分隔符来拆分
|
使用一个 POSIX
正则表达式作为分隔符来拆分
hello world
|
返回
|
把
|
把
|
|
反转字符串中字符的顺序。
|
返回字符串中最后
|
在
|
如果
|
在
|
在
xx NULL zz
|
返回指定的
|
提取
|
把
|
|
把该数字转换为它等价的二进制补码表示。
|
|
把该数字转换为它等价的十六进制补码表示。
|
|
把该数字转换为它等价的八进制补码表示。
|
把
|
|
求值参数中的转义 Unicode
字符。
Unicode 字符可以被指定为
如果服务器编码不是 UTF-8, 那么这些转义序列所标识的 Unicode 码点会被转换为实际的服务器编码; 如果不可能进行转换, 则会报告一个错误。 这个函数为带有 Unicode 转义的字符串常量提供了一种 (非标准的) 替代方案 (参见 Section 4.1.2.3)。
|
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
类型之间转换的函数。
函数 format
按照一个格式字符串产生格式化的输出,
其风格类似于 C
函数
sprintf。
format(formatstrtext[,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。