# 9.4.字符串函数和运算符
本节介绍用于检查和操作字符串值的函数和运算符。此上下文中的字符串包括类型的值性格
,性格多变
和文本
。除非另有说明,否则这些函数和运算符声明为接受和返回类型文本
.他们将互换接受性格多变
论据。类型的值性格
将转换为文本
在应用函数或运算符之前,会导致在性格
价值
SQL定义了一些字符串函数,它们使用关键字而不是逗号来分隔参数。详情见表9.9.PostgreSQL还提供了使用常规函数调用语法的这些函数的版本(请参见表9.10).
# 笔记
字符串连接运算符(||
)将接受非字符串输入,只要至少有一个输入是字符串类型,如中所示表9.9.对于其他情况,插入明确的强制文本
可用于接受非字符串输入。
表9.9.SQL字符串函数和运算符
功能/操作员 描述 例子 | ||
---|---|---|
文本 || 文本 → 文本 连接两个字符串。 “Post”| |“greSQL” → PostgreSQL | ||
文本 || 安诺纳雷 → 文本 安诺纳雷 || 文本 → 文本 将非字符串输入转换为文本,然后连接两个字符串。(非字符串输入不能是数组类型,因为这会导致数组不明确。) || 接线员。如果要连接数组的等效文本,请将其强制转换为文本 明确地说。)“值:”|| 42 → 价值:42 | ||
文本 是 [不 ][form ] 正常化 → 布尔值 检查字符串是否为指定的Unicode规范化格式。可选的* 类型 *关键字指定格式:NFC (违约),NFD , NFKC 或NFKD 。此表达式只能在服务器编码为UTF8 。请注意,使用此表达式检查规范化通常比规范化可能已经规范化的字符串更快。U&“\0061\0308bc”是NFD规范化的 → t | ||
比特长度 ( 文本 ) → 整数 返回字符串中的位数(8倍于 八位组长度 ).位长度('jose') → 32 | ||
字符长度 ( 文本 ) → 整数 字符长度 ( 文本 ) → 整数 返回字符串中的字符数。 字符长度('josé') → 4. | ||
降低 ( 文本 ) → 文本 根据数据库区域设置的规则,将字符串转换为所有小写。 下(‘汤姆’) → 汤姆 | ||
规范化 ( 文本 [, 类型 ] ) → 文本 将字符串转换为指定的Unicode规范化格式。可选的* 类型 *关键字指定格式:NFC (违约),NFD , NFKC 或NFKD .此功能只能在服务器编码为UTF8 .标准化(U&'\0061\0308bc',NFC) → U&'\00E4bc' | ||
八位组长度 ( 文本 ) → 整数 返回字符串中的字节数。 八位组长度(“何塞”) → 5. (如果服务器编码为UTF8) | ||
八位组长度 ( 性格 ) → 整数 返回字符串中的字节数。因为这个版本的函数接受类型 性格 它不会直接删除尾随空格。八位字节长度('abc':字符(4)) → 4. | ||
覆盖 ( 一串 文本 放置 新闻订阅字符串 文本 从…起 开始 整数 [ 对于 计数 整数 ] ) → 文本 替换的子字符串* 一串 这从开始 '第个字符,并扩展为计数 具有新闻订阅字符串 如果计数 如果省略,则默认为新闻订阅字符串 *.覆盖层('TXXSAS'放置'hom'从2到4) → 托马斯 | ||
位置 ( 子串 文本 在里面 一串 文本 ) → 整数 返回指定对象的第一个起始索引* 子串 在内部一串 *,如果不存在,则为零。位置(“托马斯”中的“om”) → 3. | ||
子串 ( 一串 文本 [ 从…起 开始 整数 ][ for count integer ] ) → 文本 提取* 一串 从开始 '第个字符(如果已指定),并在计数 字符(如果指定了)。提供至少一个开始 和计数 *.子字符串(“托马斯”从2变为3) → 高阶模 子字符串(3中的“托马斯”) → 奥马斯 子字符串('Thomas'代表2) → Th | ||
子串 ( 一串 文本 从…起 图案 文本 ) → 文本 提取匹配POSIX正则表达式的第一个子串;看见第9.7.3节. 子字符串(“…$”中的“托马斯”) → 马斯 | ||
子串 ( 一串 文本 相像的 图案 文本 逃跑 逃跑 文本 ) → 文本 子串 ( 一串 文本 从…起 图案 文本 对于 逃跑 文本 ) → 文本 提取与SQL正则表达式匹配的第一个子串;看见第9.7.2节.自SQL:2003起指定了第一种形式;第二种形式只有SQL:1999版本,应该被视为过时。 子字符串('Thomas'相似'%#“o#u a#“u'escape'#”) → 奥玛 | ||
修剪 ( [ 主要的 | 拖尾的 | 二者都 ] [ 人物 文本 ] 从…起 一串 文本 ) → 文本 删除中仅包含字符的最长字符串* 人物 (默认为空格)从起点、终点或两端开始(二者都 是默认值)的一串 *.修剪(从“yxTomxx”开始的两个“xyz”) → 汤姆 |
修剪 ( [ 主要的 | 拖尾的 | 二者都 ] [ 从…起 ] 一串 文本 [, 人物 文本 ] ) → 文本 这是的非标准语法 trim() .修剪(均来自“yxTomxx”、“xyz”) → 汤姆 |
上面的 ( 文本 ) → 文本 根据数据库区域设置的规则,将字符串转换为所有大写字母。 上(‘汤姆’) → 汤姆 |
其他字符串操作功能可用,并在中列出表9.10。其中一些函数在内部用于实现中列出的SQL标准字符串函数表9.9.
表9.10.其他字符串函数
作用 描述 例子 | ||
---|---|---|
ascii码 ( 文本 ) → 整数 返回参数的第一个字符的数字代码。在UTF8编码中,返回字符的Unicode码点。在其他多字节编码中,参数必须是ASCII字符。 ascii('x') → 120 | ||
btrim ( 一串 文本 [, 人物 文本 ] ) → 文本 删除中仅包含字符的最长字符串* 人物 (默认为空格)从一串 *.btrim('xyxtrimyyx','xyz') → 修剪 | ||
chr ( 整数 ) → 文本 返回包含给定代码的字符。在UTF8编码中,参数被视为Unicode代码点。在其他多字节编码中,参数必须指定ASCII字符。 chr(0) 是不允许的,因为文本数据类型不能存储该字符。chr(65) → A. | ||
海螺 ( val1 “任何” [, val2 “任何” [, ...] ] ) → 文本 连接所有参数的文本表示形式。忽略空参数。 concat('abcde',2,NULL,22) → abcde222 | ||
康卡特乌斯酒店 ( 九月 文本 , val1 “任何” [, val2 “任何” [, ...] ] ) → 文本 使用分隔符连接除第一个参数外的所有参数。第一个参数用作分隔符字符串,不应为NULL。其他空参数将被忽略。 concat_ws(',','abcde',2,NULL,22) → abcde,2,22 | ||
总体安排 ( formatstr 文本 [, 格式化参数 “任何” [, ...] ] ) → 文本 根据格式字符串格式化参数;看见第9.4.1节.此函数与C函数类似 把格式数据写成串 .格式('Hello%s,%1$s','World') → 你好,世界,世界 | ||
initcap ( 文本 ) → 文本 将每个单词的第一个字母转换为大写,其余字母转换为小写。单词是由非字母数字字符分隔的字母数字字符序列。 initcap(“你好,托马斯”) → 嗨,托马斯 | ||
左边 ( 一串 文本 , n 整数 ) → 文本 先回来* n 字符串中的字符,或n *是负数,返回最后一个 | n | 角色。左('abcde',2) → ab |
长 ( 文本 ) → 整数 返回字符串中的字符数。 长度('jose') → 4. | ||
lpad ( 一串 文本 , 长 整数 [, 填满 文本 ] ) → 文本 扩展* 一串 长度长 通过预先安排角色填满 (默认情况下为空格)。如果一串 已经超过长 *然后它被截断(在右边)。lpad('hi',5',xy') → xyzhi | ||
ltrim ( 一串 文本 [, 人物 文本 ] ) → 文本 删除中仅包含字符的最长字符串* 人物 (默认为空格)从一串 *.ltrim('zzzytest', 'xyz') →测试 | ||
md5 (文本 ) →文本 计算 MD5哈希参数,结果用十六进制写。 md5('abc') →900150983cd24fb0d6963f7d28e17f72 | ||
parse_ident (合格的标识符 文本 [,严格模式*_布尔值 * 默认 真的 ]) → 文本[]<br/><br/>分裂* 合格的标识符*到标识符数组中,删除对单个标识符的任何引用。默认情况下,最后一个标识符后面的多余字符被认为是错误的;但如果第二个参数是 错误的, 那么这些多余的字符将被忽略。(此行为对于解析函数等对象的名称很有用。)请注意,此函数不会截断超长标识符。如果要截断,可以将结果转换为 姓名[].<br/><br/> parse_ident('"SomeSchema".someTable')→ {SomeSchema,sometable}` | ||
pg_client_encoding ( ) →姓名 返回当前客户端编码名称。 pg_client_encoding() →UTF8 | ||
报价标识 (文本 ) →文本 返回适当引用的给定字符串,以用作 SQL 语句字符串中的标识符。仅在必要时添加引号(即,如果字符串包含非标识符字符或将大小写折叠)。嵌入的引号正确加倍。也可以看看示例 43.1. quote_ident('Foo bar') →“美食吧” | ||
引用文字 (文本 ) →文本 返回适当引用的给定字符串,以用作 SQL 语句字符串中的字符串文字。嵌入的单引号和反斜杠被适当地加倍。注意 引用文字 在 null 输入上返回 null;如果参数可能为空,quote_nullable 往往更合适。也可以看看示例 43.1.quote_literal(E'O\'Reilly') →'O''赖利' | ||
引用文字 (任何元素 ) →文本 将给定值转换为文本,然后将其作为文字引用。嵌入的单引号和反斜杠被适当地加倍。 报价文字(42.5) →'42.5' | ||
quote_nullable (文本 ) →文本 返回适当引用的给定字符串,以用作 SQL 语句字符串中的字符串文字;或者,如果参数为 null,则返回 空值 .嵌入的单引号和反斜杠被适当地加倍。也可以看看示例 43.1.quote_nullable(NULL) →空值 | ||
quote_nullable (任何元素 ) →文本 将给定值转换为文本,然后将其作为文字引用;或者,如果参数为 null,则返回 空值 .嵌入的单引号和反斜杠被适当地加倍。quote_nullable(42.5) →'42.5' | ||
正则表达式匹配 (细绳 文本 ,图案 文本 [,旗帜* 文本 ]) →文本[] 将 POSIX 正则表达式的第一个匹配结果捕获的子字符串返回到 细绳 *;看第 9.7.3 节.regexp_match('foobarbequebaz', '(bar)(beque)') →{酒吧,贝克} | ||
正则表达式匹配 (细绳 文本 ,图案 文本 [,旗帜* 文本 ]) →文本集[] 将 POSIX 正则表达式的第一个匹配结果捕获的子字符串返回到 细绳 *, 或多个匹配项,如果g 使用标志;看第 9.7.3 节.regexp_matches('foobarbequebaz', 'ba.', 'g') →``<br/> {bar}<br/> {baz}<br/><br/> | ||
正则表达式_replace (细绳 文本 ,图案 文本 ,替换 文本 [,旗帜* *文本 ]) →文本 替换由 POSIX 正则表达式的第一个匹配产生的子字符串,或多个子字符串匹配,如果 g 使用标志;看第 9.7.3 节.regexp_replace('Thomas', '.[mN]a.', 'M') →钍 | ||
regexp_split_to_array (细绳 文本 ,图案 文本 [,旗帜* 文本 ]) →文本[] 分裂 细绳 *使用 POSIX 正则表达式作为分隔符,生成结果数组;看第 9.7.3 节.regexp_split_to_array('hello world', '\s+') →{你好世界} | ||
regexp_split_to_table (细绳 文本 ,图案 文本 [,旗帜* 文本 ]) →文本集 分裂 细绳 *使用 POSIX 正则表达式作为分隔符,产生一组结果;看第 9.7.3 节.regexp_split_to_table('hello world', '\s+') →``<br/>你好<br/>世界<br/><br/> | ||
重复 (细绳 文本 , 数字 整数 ) → 文本 重复* 细绳 指定的数字 *次。重复('Pg',4) → PgPgPgPg | ||
代替 ( 细绳 文本 , 从 文本 , 到 文本 ) → 文本 替换所有出现在* 细绳 子串从 带子串到 *.替换('abcdefabcdef','cd','XX') → abXXefabXXef | ||
逆转 ( 文本 ) → 文本 反转字符串中字符的顺序。 反向('abcde') → edcba | ||
对 ( 细绳 文本 , n 整数 ) → 文本 最后返回* n 字符串中的字符,或者当n *是负数,返回除第一个以外的所有内容 | n | 人物。对('abcde',2) →德 |
rpad (细绳 文本 ,长度 整数 [,充满* 文本 ]) →文本 扩展 细绳 到长度长度 通过附加字符充满 (默认为空格)。如果细绳 已经长于长度 *然后它被截断。rpad('嗨',5,'xy') →喜喜 | ||
rtrim ( 细绳 文本 [, 人物 文本 ] ) → 文本 删除仅包含字符的最长字符串* 人物 (默认为空格)从末尾细绳 *.rtrim('testxxzx', 'xyz') → 测试 | ||
拆分部分 ( 细绳 文本 , 分隔符 文本 , n 整数 ) → 文本 分裂* 细绳 在发生分隔符 并返回n 'th 字段(从一开始计数),或者当n *为负,返回 | n | '倒数第二个字段。split_part('abc~@~def~@~ghi', '~@~', 2) →定义 split_part('abc,def,ghi,jkl', ',', -2) →吉 |
strpos (细绳 文本 ,子串 文本 ) →整数 返回指定的第一个起始索引* 子串 之内细绳 *,如果不存在,则为零。(如同位置(* 子串* 在 * 细绳*) ,但请注意颠倒的参数顺序。)strpos('高', 'ig') →2 | ||
子串 (细绳 文本 ,开始 整数 [,数数* 整数 ]) →文本 提取子串 细绳 开始于开始 'th 字符,并扩展为数数 *如果指定了字符。(如同子串(* 细绳* 从 * 开始* 为了 * 数数*) .)substr('字母表', 3) → 帕贝特 substr('字母表', 3, 2) → 酸碱度 | ||
以。。开始 ( 细绳 文本 , 字首 文本 ) → 布尔值 如果返回真* 细绳 以。。开始字首 *.starts_with('alphabet', 'alph') → 吨 | ||
string_to_array ( 细绳 文本 ,分隔符 文本 [,空字符串*_文本 * ]) → 文本[]<br/><br/>拆分* 细绳*在发生* 分隔符*并将结果字段形成为 文本大批。如果* 分隔符*是 空值, 中的每个字符* 细绳*将成为数组中的一个单独元素。如果* 分隔符*是一个空字符串,那么* 细绳*被视为单个字段。如果* 空字符串*提供,而不是 空值, 匹配该字符串的字段被替换为 空值.<br/><br/> string_to_array('xx→ {xx,NULL,zz}` | ||
string_to_table (细绳 文本 ,分隔符 文本 [,空字符串*_文本 * ]) → 文本集<br/><br/>拆分* 细绳*在发生* 分隔符*并将结果字段作为一组返回 文本行。如果* 分隔符*是 空值, 中的每个字符* 细绳*将成为结果的单独行。如果* 分隔符*是一个空字符串,那么* 细绳*被视为单个字段。如果* 空字符串*提供,而不是 空值, 匹配该字符串的字段被替换为 空值.<br/><br/> string_to_table('xx~^~yy~^~zz', '~^~', 'yy')→``<br/><br/> xx NULL zz ` | ||
to_ascii (细绳 文本 ) →文本 to_ascii (细绳 文本 ,编码 姓名 ) →文本 to_ascii (细绳 文本 ,编码 整数 ) →文本 转换* 细绳 从另一种编码转换为 ASCII,可以通过名称或编号来识别。如果编码 *省略了假设数据库编码(实际上这是唯一有用的情况)。转换主要包括删除重音。仅支持从拉丁语1 ,拉丁语2 ,拉丁语9 , 和WIN1250 编码。(见不重音另一个更灵活的解决方案的模块。)to_ascii('卡雷尔') →卡雷尔 | ||
to_hex (整数 ) →文本 to_hex (大整数 ) →文本 将数字转换为其等效的十六进制表示。 to_hex(2147483647) →7ffffff | ||
翻译 (细绳 文本 ,从 文本 ,到 文本 ) →文本 替换每个字符* 细绳 匹配中的一个字符从 用对应的字符设置到 放。如果从 长于到 , 中出现的多余字符从 *被删除。翻译(“12345”,“143”,“斧头”) →2x5 | ||
unistr (文本 ) →文本 评估参数中的转义 Unicode 字符。Unicode 字符可以指定为 \* XXXX* (4 个十六进制数字),\+* XXXXXX* (6 个十六进制数字),\u* XXXX* (4 个十六进制数字),或\U* XXXXXXX* (8 个十六进制数字)。要指定反斜杠,请编写两个反斜杠。所有其他字符均按字面意思表示。如果服务器编码不是 UTF-8,则将这些转义序列之一标识的 Unicode 代码点转换为实际的服务器编码;如果不可能,则会报告错误。 此函数提供了一个(非标准)替代具有 Unicode 转义的字符串常量(参见第 4.1.2.3 节)。 unistr('d\0061t\+000061') →数据 unistr('d\u0061t\U00000061') →数据 |
这连接
,concat_ws
和格式
函数是可变参数的,因此可以将要连接或格式化的值传递为标有杂音
关键字(见第 38.5.6 节)。数组的元素被视为函数的单独普通参数。如果可变参数数组参数为 NULL,连接
和concat_ws
返回 NULL,但是格式
将 NULL 视为零元素数组。
另见聚合函数string_agg
在第 9.21 节,以及用于在字符串和拜茶
输入表 9.13.
# 9.4.1.格式
功能格式
生成根据格式字符串格式化的输出,其风格类似于 C 函数冲刺
.
format(formatstr text [, formatarg "any" [, ...] ])
格式str
是一个格式字符串,它指定结果的格式。格式字符串中的文本直接复制到结果中,除了格式说明符被使用。格式说明符充当字符串中的占位符,定义应如何格式化后续函数参数并将其插入结果中。每个*格式参数
*参数根据其数据类型的通常输出规则转换为文本,然后根据格式说明符格式化并插入结果字符串。
格式说明符由%
性格和形式
%[position][flags][width]type
其中组件字段是:
位置
(选修的)
一串表格*
n*$
在哪里*n
是要打印的参数的索引。索引 1 表示之后的第一个参数格式str
.如果位置
*被省略,默认是按顺序使用下一个参数。
旗帜
(选修的)
控制格式说明符的输出格式的附加选项。目前唯一支持的标志是减号 (-
) 这将导致格式说明符的输出左对齐。这没有任何影响,除非*宽度
*字段也被指定。
宽度
(选修的)
指定最低限度用于显示格式说明符输出的字符数。输出在左侧或右侧填充(取决于-
flag) 用空格填充宽度。太小的宽度不会导致输出截断,而只是被忽略。可以使用以下任何一种来指定宽度:正整数;一个星号(*
) 使用下一个函数参数作为宽度;或形式的字符串**
n*$
使用*n
*函数参数作为宽度。
如果宽度来自函数参数,则该参数在用于格式说明符值的参数之前使用。如果宽度参数为负,则结果左对齐(就像-
已指定标志)在长度字段内腹肌
(宽度
)。
类型
(必需的)
用于生成格式说明符输出的格式转换类型。支持以下类型:
s
将参数值格式化为简单字符串。空值被视为空字符串。一世
将参数值视为 SQL 标识符,必要时将其双引号。值为 null 是错误的(相当于报价标识
)。大号
将参数值引用为 SQL 文字。空值显示为字符串空值
, 不带引号(相当于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')
以下是使用示例*宽度
*领域和-
旗帜:
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 |
这些例子展示了使用*位置
*领域:
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 函数不同冲刺
, PostgreSQL 的格式
函数允许有和没有格式说明符*位置
字段以相同的格式字符串混合。没有格式说明符位置
*字段总是在使用的最后一个参数之后使用下一个参数。除此之外格式
function 不需要在格式字符串中使用所有函数参数。例如:
SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
Result: Testing three, two, three
这%一世
和%L
格式说明符对于安全地构造动态 SQL 语句特别有用。看示例 43.1.