字符串函数和运算符

字符串运算符

|| 运算符用于执行连接。

字符串函数

注意

这些函数假设输入字符串包含有效的 UTF-8 编码的 Unicode 代码点。没有显式检查有效 UTF-8,并且这些函数可能在无效 UTF-8 上返回不正确的结果。可以使用 from_utf8() 来更正无效 UTF-8 数据。

此外,这些函数对 Unicode 代码点进行操作,而不是对用户可见的字符(或音素)。一些语言将多个代码点组合成一个用户感知的字符,即语言的书写系统中的基本单元,但这些函数会将每个代码点视为单独的单元。

lower()upper() 函数不执行某些语言所需的特定于语言环境、特定于上下文的或一对多映射。具体来说,这将对立陶宛语、土耳其语和阿塞拜疆语返回不正确的结果。

chr(n) -> varchar()

将 Unicode 代码点 n 返回为单个字符字符串。

codepoint(string) -> integer()

返回 string 的唯一字符的 Unicode 代码点。

concat(string1, ..., stringN) -> varchar()

返回 string1string2...stringN 的连接。此函数提供与 SQL 标准连接运算符 (||) 相同的功能。

ends_with(string, substring) -> boolean()

返回 string 是否以 substring 结尾。

hamming_distance(string1, string2) -> bigint()

返回 string1string2 的汉明距离,即相应字符不同的位置数。请注意,这两个字符串必须具有相同的长度。

length(string) -> bigint()

返回 string 的字符长度。

levenshtein_distance(string1, string2) -> bigint()

返回 string1string2 的莱文斯坦编辑距离,即将 string1 更改为 string2 所需的单字符编辑(插入、删除或替换)的最小数量。

lower(string) -> varchar()

string 转换为小写。

lpad(string, size, padstring) -> varchar()

使用 padstringstring 左边填充到 size 个字符。如果 size 小于 string 的长度,则结果将被截断为 size 个字符。 size 必须是非负数,并且 padstring 不能为空。

ltrim(string) -> varchar()

删除 string 开头的空白字符。有关识别的空白字符集,请参见 trim()

ltrim(string, chars) -> varchar()

string 开头删除包含 chars 中字符的最长子字符串。

SELECT ltrim('test', 't'); -- est
SELECT ltrim('tetris', 'te'); -- ris
replace(string, search) -> varchar()

string 中删除所有 search 的实例。

replace(string, search, replace) -> varchar()

string 中所有 search 的实例替换为 replace

如果 search 是一个空字符串,则在每个字符前面和 string 末尾插入 replace

replace_first(string, search, replace) -> varchar()
替换 ``string`` 第一个 ``search`` 实例为 ``replace`` .()

如果 search 是一个空字符串,则在 string 的开头插入 replace

reverse(string) -> varchar()

以相反的顺序返回 string 中的字符。

rpad(string, size, padstring) -> varchar()

使用 padstringstring 右边填充到 size 个字符。如果 size 小于 string 的长度,则结果将被截断为 size 个字符。 size 必须是非负数,并且 padstring 不能为空。

rtrim(string) -> varchar()

删除 string 末尾的空白字符。有关识别的空白字符集,请参见 trim()

rtrim(string, chars) -> varchar()

string 末尾删除包含 chars 中字符的最长子字符串。

SELECT rtrim('test', 't'); -- tes
SELECT rtrim('test...', '.'); -- test
split(string, delimiter) -> array(varchar)

根据 delimiter 拆分 string 并返回一个数组。

split(string, delimiter, limit) -> array(varchar)

根据 delimiter 拆分 string 并返回一个大小最多为 limit 的数组。数组中的最后一个元素始终包含 string 中剩下的所有内容。 limit 必须是一个正数。

split_part(string, delimiter, index) -> varchar()

根据 delimiter 拆分 string 并返回字段 index。字段索引从 1 开始。如果索引大于字段数,则返回 null。

split_to_map(string, entryDelimiter, keyValueDelimiter) -> map<varchar, varchar>()

使用 entryDelimiterkeyValueDelimiter 拆分 string 并返回一个 map。 entryDelimiterstring 拆分为键值对。 keyValueDelimiter 将每个对拆分为键和值。请注意, entryDelimiterkeyValueDelimiter 是按字面意思解释的,即作为完整的字符串匹配。

split_to_map(string, entryDelimiter, keyValueDelimiter, function(K,V1,V2,R)) -> map<varchar, varchar>()

使用 entryDelimiterkeyValueDelimiter 拆分 string 并返回一个 map。 entryDelimiterstring 拆分为键值对。 keyValueDelimiter 将每个对拆分为键和值。请注意, entryDelimiterkeyValueDelimiter 是按字面意思解释的,即作为完整的字符串匹配。在遇到重复键的情况下,会调用 function(K,V1,V2,R) 来确定 map 中应该包含的值。

SELECT(split_to_map('a:1;b:2;a:3', ';', ':', (k, v1, v2) -> v1)); -- {"a": "1", "b": "2"}
SELECT(split_to_map('a:1;b:2;a:3', ';', ':', (k, v1, v2) -> CONCAT(v1, v2))); -- {"a": "13", "b": "2"}
split_to_multimap(string, entryDelimiter, keyValueDelimiter) -> map(varchar, array(varchar))

使用 entryDelimiterkeyValueDelimiter 拆分 string 并返回一个 map,该 map 包含每个唯一键的值数组。 entryDelimiterstring 拆分为键值对。 keyValueDelimiter 将每个对拆分为键和值。每个键的值将按照它们在 string 中出现的顺序排列。请注意, entryDelimiterkeyValueDelimiter 是按字面意思解释的,即作为完整的字符串匹配。

strpos(string, substring) -> bigint()

返回 substringstring 中第一个实例的起始位置。位置从 1 开始。如果未找到,则返回 0

starts_with(string, substring) -> boolean()

返回 string 是否以 substring 开头。

strpos(string, substring, instance) -> bigint()

返回 string 中第 instancesubstring 的位置。 instance 必须为正数。位置从 1 开始。如果未找到,则返回 0

strrpos(string, substring) -> bigint()

返回 string 中最后一个 substring 的起始位置。位置从 1 开始。如果未找到,则返回 0

strrpos(string, substring, instance) -> bigint()

从字符串末尾开始,返回 string 中第 instancesubstring 的位置。 instance 必须为正数。位置从 1 开始。如果未找到,则返回 0

position(substring IN string) -> bigint()

返回 substringstring 中第一个实例的起始位置。位置从 1 开始。如果未找到,则返回 0

substr(string, start) -> varchar()

从起始位置 start 返回 string 的剩余部分。位置从 1 开始。负起始位置被解释为相对于字符串末尾。

substr(string, start, length) -> varchar()

从起始位置 start 返回 string 中长度为 length 的子字符串。位置从 1 开始。负起始位置被解释为相对于字符串末尾。

trail(string, N) -> varchar()

返回输入字符串的最后 N 个字符。

trim(string) -> varchar()

string 中删除前导和尾随空格。

识别空格字符

代码

描述

代码

描述

9

TAB (水平制表符)

U+1680

Ogham 空格标记

10

LF (NL 换行符,换行)

U+2000

En Quad

11

VT (垂直制表符)

U+2001

Em Quad

12

FF (NP 换页符,新页)

U+2002

En Space

13

CR (回车)

U+2003

Em Space

28

FS (文件分隔符)

U+2004

Three-Per-Em Space

29

GS (组分隔符)

U+2005

Four-Per-Em Space

30

RS (记录分隔符)

U+2006

Four-Per-Em Space

31

US (单元分隔符)

U+2008

标点符号空格

32

空格

U+2009

细空格

_

_

U+200a

毛发空格

_

_

U+200a

毛发空格

_

_

U+2028

行分隔符

_

_

U+2029

段落分隔符

_

_

U+205f

中等数学空格

_

_

U+3000

汉字空格

trim(string, chars) -> varchar()

string 的开头和结尾删除包含 chars 中字符的最长子字符串。

SELECT trim('test', 't'); -- es
SELECT trim('.t.e.s.t.', '.t'); -- e.s
upper(string) -> varchar()

string 转换为大写。

word_stem(word) -> varchar()

返回英语中 word 的词干。

word_stem(word, lang) -> varchar()

返回 lang 语言中 word 的词干。

Unicode 函数

normalize(string) -> varchar()

使用 NFC 规范化形式转换 string

normalize(string, form) -> varchar()

使用指定的规范化形式转换 stringform 必须为以下关键字之一

形式

描述

NFD

规范分解

NFC

规范分解,然后是规范组合

NFKD

兼容性分解

NFKC

兼容性分解,然后是规范组合

注意

此 SQL 标准函数具有特殊的语法,需要将 form 指定为关键字,而不是字符串。

to_utf8(string) -> varbinary()

string 编码为 UTF-8 varbinary 表示形式。

from_utf8(binary) -> varchar()

binary 中解码 UTF-8 编码的字符串。无效的 UTF-8 序列将替换为 Unicode 替换字符 U+FFFD

from_utf8(binary, replace) -> varchar()

binary 中解码 UTF-8 编码的字符串。无效的 UTF-8 序列将替换为 replace。替换字符串 replace 必须是单个字符或为空(在这种情况下,将删除无效字符)。

key_sampling_percent(varchar) -> double()

根据给定 varchar 的哈希生成 0.0 到 1.0 之间的双精度值。此函数对于数据的确定性采样非常有用。