本节介绍用于检查和操作字符串值的函数和运算符。此处的字符串包括类型 character
、character varying
和 text
的值。除非另有说明,否则将声明这些函数和运算符接受和返回类型 text
。它们可互换地接受 character varying
参数。在应用函数或运算符之前,类型为 character
的值将转换为 text
,从而消除 character
值中的所有尾随空格。
SQL定义了一些使用关键字(而不是逗号)分隔参数的字符串函数。详细信息见 表 9.9。 PostgreSQL 还提供了使用常规函数调用语法的这些函数的版本(参见 表 9.10)。
字符串连接运算符 (||
) 将接受非字符串输入,只要至少有一个输入为字符串类型,如 表 9.9 所示。对于其他情况,插入一个明确强制转换为 text
可以用于接受非字符串输入。
表 9.9SQL字符串函数和运算符
函数/运算符 说明 示例 |
---|
连接两个字符串。
|
将非字符串输入转换为文本,然后连接两个字符串。(非字符串输入不能是数组类型,因为那样会与数组
|
从
|
检查字符串是否处于指定的 Unicode 规范形式。可选的
|
返回字符串中的比特数(
|
返回字符串中的字符数。
|
根据数据库语言环境的规则将字符串转换为全部小写。
|
通过在
|
从
|
将字符串转换成指定的 Unicode 规范形式。可选的
|
返回字符串中的字节数。
|
返回字符串中的字节数。由于此版本的函数直接接受类型
|
用
|
返回指定
|
通过附加字符
|
从
|
如果指定了
|
提取匹配 POSIX 正则表达式的第一个子字符串;请参阅第 9.7.3 节。
|
提取符合SQL正则表达式的第一个子字符串;请参见 第 9.7.2 节。第一种形式已在 SQL:2003 中制定;第二种形式仅在 SQL:1999 中出现,现在已过时。
|
从
|
这是
|
如字符串中的所有字符都被分配了 Unicode 代码点,则返回 |
根据数据库语言环境的规则,转换字符串为全部大写。
|
支持其他字符串操作函数和运算符,这些函数和运算符列于 表 9.10 中。(一些函数和运算符在内部用于实现SQL-标准字符串函数列举在表 9.9中。
另外还有模式匹配运算符,参见9.7 节,以及全文本搜索运算符,参见章节 12。
表 9.10. 其他字符串函数和运算符
函数/运算符 说明 示例 |
---|
如果第一个字符串以第二个字符串开头则返回真(等于
|
返回参数的第一个字符的数字代码。在UTF8编码中,返回字符的 Unicode 编码点。在其他多字节编码中,参数必须是ASCII字符。
|
返回具有给定代码的字符。在UTF8编码中参数被当作 Unicode 编码点。在其他多字节编码中参数必须指定ASCII字符。禁止使用
|
连接所有参数的文本表示。忽略 NULL 参数。
|
连接除第一个参数之外的所有参数,并使用分隔符。第一个参数用作分隔符字符串,不应为 NULL。忽略其他 NULL 参数。
|
根据格式字符串对参数进行格式化;请参阅 第 9.4.1 节。此函数与 C 函数
|
将每个单词的首字母转换为大写,其余字母转换为小写。单词是由非字母数字字符分隔的一系列字母数字字符。
|
返回字符串中的前
|
返回字符串中的字符数。
|
计算参数的 MD5 哈希,结果以十六进制的形式写入。
|
将
|
返回当前客户端编码名称。
|
返回给定字符串,经过适当引用后供用作SQLstatement 字符串中的标识符。仅在必要时添加引用(即字符串包含非标识符字符时或会进行大小写转换时)。正确双写嵌入的引用。另请参见 示例 41.1。
|
返回给定字符串,经过适当引用后供用作SQLstatement 字符串中的字符串字面量。正确双写嵌入的单引号和反斜杠。请注意,
|
将给定值转换为文本,然后作为字面量进行引用。正确双写嵌入的单引号和反斜杠。
|
返回给定字符串,经过适当引用后供用作SQLstatement 字符串;或者,如果参数为 null,则返回
|
将给定值转换为文本,然后作为字面量进行引用;或者,如果参数为 null,则返回
|
返回符合正则表达式的
|
返回
|
检查 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
关键字标记的数组(参见 第 36.5.6 节)。数组的元素将被视为函数的独立常规参数。如果可变数组参数为 NULL,则 concat
和 concat_ws
将返回 NULL,但 format
将 NULL 视为零元素数组。
另请参见 第 9.21 节 中的聚合函数 string_agg
,以及在 表 9.13 中用于在字符串和 bytea
类型之间进行转换的函数。
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 标识符,必要时双引号引用它。值为空(相当于 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
不同,PostgreSQL 的 format
函数允许在同一个格式字符串中混用带和不带 position
字段的格式说明符。没有 position
字段的格式说明符始终使用最后消耗的参数之后的下一个参数。此外,format
函数不要求在格式字符串中使用所有函数参数。例如
SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
Result: Testing three, two, three
%I
和 %L
格式说明符对于安全构建动态 SQL 语句特别有用。请参见示例 41.1。