
字符串操作函数
本文主要涉及 ClickHouse 中用于字符串操作的函数功能和语法,在字符串中搜索与替换可参考:ClickHouse 字符串搜索函数、ClickHouse 字符串替换函数 。
1. empty
检查输入字符串是否为空。如果字符串至少包含一个字节(即使是空格或空字节),则认为字符串非空。该函数也适用于数组和 UUID。
语法:
参数:
-
x— 输入值。类型为字符串。
返回值:
-
如果是空字符串,返回
1;否则返回0。类型为UInt8。
示例:
SELECT empty('');
结果:
┌─empty('')─┐
│ 1 │
└───────────┘
2. notEmpty
检查输入字符串是否非空。如果字符串至少包含一个字节(即使是空格或空字节),则认为字符串非空。该函数也适用于数组和 UUID。
语法:
参数:
-
x— 输入值。类型为字符串。
返回值:
-
如果是非空字符串,返回
1;否则返回0。类型为UInt8。
示例:
SELECT notEmpty('text');
结果:
┌─notEmpty('text')─┐
│ 1 │
└──────────────────┘
3. length
返回字符串的长度(以字节为单位),而不是字符或 Unicode 码点的数量。该函数也适用于数组。
别名: OCTET_LENGTH
语法:
参数:
-
s— 输入字符串或数组。类型为字符串或数组。
返回值:
-
字符串或数组
s的长度(以字节为单位)。类型为UInt64。
示例:
SELECT length('Hello, world!');
结果:
┌─length('Hello, world!')─┐
│ 13 │
└─────────────────────────┘
4. lengthUTF8
返回字符串的长度(以 Unicode 码点为单位),而不是字节或字符的数量。假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
别名: CHAR_LENGTH、CHARACTER_LENGTH
语法:
参数:
-
s— 包含有效 UTF-8 编码文本的字符串。类型为字符串。
返回值:
-
字符串
s的长度(以 Unicode 码点为单位)。类型为UInt64。
示例:
SELECT lengthUTF8('Здравствуй, мир!');
结果:
┌─lengthUTF8('Здравствуй, мир!')─┐
│ 16 │
└────────────────────────────────┘
5. left
返回字符串 s 的子字符串,从左侧开始指定的 offset。
语法:
参数:
-
s— 要计算子字符串的字符串。类型为字符串或 FixedString。 -
offset— 偏移量的字节数。类型为UInt*。
返回值:
-
如果
offset为正数:从字符串左侧开始的offset字节的子字符串。 -
如果
offset为负数:从字符串左侧开始的length(s) - |offset|字节的子字符串。 -
如果长度为 0,则返回空字符串。
示例:
SELECT left('Hello', 3);
结果:
Hel
6. leftUTF8
返回 UTF-8 编码字符串 s 的子字符串,从左侧开始指定的 offset。
语法:
参数:
-
s— 要计算子字符串的 UTF-8 编码字符串。类型为字符串或 FixedString。 -
offset— 偏移量的字节数。类型为UInt*。
返回值:
-
如果
offset为正数:从字符串左侧开始的offset字节的子字符串。 -
如果
offset为负数:从字符串左侧开始的length(s) - |offset|字节的子字符串。 -
如果长度为 0,则返回空字符串。
示例:
SELECT leftUTF8('Привет', 4);
结果:
Прив
结果:
7. leftPad
从左侧用空格或指定的字符串(如有需要,可重复多次)填充字符串,直到结果字符串达到指定的 length。
语法:
leftPad(string, length[, pad_string])
别名: LPAD
参数:
-
string— 要填充的输入字符串。类型为字符串。 -
length— 结果字符串的长度。类型为UInt或Int。如果该值小于输入字符串的长度,则输入字符串将被缩短为length字符。 -
pad_string— 用于填充输入字符串的字符串。类型为字符串。可选参数。如果未指定,则输入字符串将用空格填充。
返回值:
-
给定长度的左填充字符串。类型为字符串。
示例:
SELECT leftPad('abc', 7, '*'), leftPad('def', 7);
结果:
┌─leftPad('abc', 7, '*')─┬─leftPad('def', 7)─┐
│ ****abc │ def │
└────────────────────────┴───────────────────┘
8. leftPadUTF8
从左侧用空格或指定的字符串(如有需要,可重复多次)填充字符串,直到结果字符串达到指定的 length。与 leftPad 不同,leftPadUTF8 以码点为单位测量字符串长度,而不是以字节为单位。
语法:
leftPadUTF8(string, length[, pad_string])
参数:
-
string— 要填充的输入字符串。类型为字符串。 -
length— 结果字符串的长度。类型为UInt或Int。如果该值小于输入字符串的长度,则输入字符串将被缩短为length字符。 -
pad_string— 用于填充输入字符串的字符串。类型为字符串。可选参数。如果未指定,则输入字符串将用空格填充。
返回值:
-
给定长度的左填充字符串。类型为字符串。
示例:
SELECT leftPadUTF8('абвг', 7, '*'), leftPadUTF8('дежз', 7);
结果:
┌─leftPadUTF8('абвг', 7, '*')─┬─leftPadUTF8('дежз', 7)─┐
│ ***абвг │ дежз │
└─────────────────────────────┴────────────────────────┘
9. right
返回字符串 s 的子字符串,从右侧开始指定的 offset。
语法:
参数:
-
s— 要计算子字符串的字符串。类型为字符串或 FixedString。 -
offset— 偏移量的字节数。类型为UInt*。
返回值:
-
如果
offset为正数:从字符串右侧开始的offset字节的子字符串。 -
如果
offset为负数:从字符串右侧开始的length(s) - |offset|字节的子字符串。 -
如果长度为 0,则返回空字符串。
示例:
SELECT right('Hello', 3);
结果:
llo
结果:
10. rightUTF8
返回 UTF-8 编码字符串 s 的子字符串,从右侧开始指定的 offset。
语法:
参数:
-
s— 要计算子字符串的 UTF-8 编码字符串。类型为字符串或 FixedString。 -
offset— 偏移量的字节数。类型为UInt*。
返回值:
-
如果
offset为正数:从字符串右侧开始的offset字节的子字符串。 -
如果
offset为负数:从字符串右侧开始的length(s) - |offset|字节的子字符串。 -
如果长度为 0,则返回空字符串。
示例:
SELECT rightUTF8('Привет', 4);
结果:
ивет
结果:
11. rightPad
从右侧用空格或指定的字符串(如有需要,可重复多次)填充字符串,直到结果字符串达到指定的 length。
语法:
rightPad(string, length[, pad_string])
别名: RPAD
参数:
-
string— 要填充的输入字符串。类型为字符串。 -
length— 结果字符串的长度。类型为UInt或Int。如果该值小于输入字符串的长度,则输入字符串将被缩短为length字符。 -
pad_string— 用于填充输入字符串的字符串。类型为字符串。可选参数。如果未指定,则输入字符串将用空格填充。
返回值:
-
给定长度的右填充字符串。类型为字符串。
示例:
SELECT rightPad('abc', 7, '*'), rightPad('abc', 7);
结果:
┌─rightPad('abc', 7, '*')─┬─rightPad('abc', 7)─┐
│ abc**** │ abc │
└─────────────────────────┴────────────────────┘
12. rightPadUTF8
从右侧用空格或指定的字符串(如有需要,可重复多次)填充字符串,直到结果字符串达到指定的 length。与 rightPad 不同,rightPadUTF8 以码点为单位测量字符串长度,而不是以字节为单位。
语法:
rightPadUTF8(string, length[, pad_string])
参数:
-
string— 要填充的输入字符串。类型为字符串。 -
length— 结果字符串的长度。类型为UInt或Int。如果该值小于输入字符串的长度,则输入字符串将被缩短为length字符。 -
pad_string— 用于填充输入字符串的字符串。类型为字符串。可选参数。如果未指定,则输入字符串将用空格填充。
返回值:
-
给定长度的右填充字符串。类型为字符串。
示例:
SELECT rightPadUTF8('абвг', 7, '*'), rightPadUTF8('абвг', 7);
结果:
┌─rightPadUTF8('абвг', 7, '*')─┬─rightPadUTF8('абвг', 7)─┐
│ абвг*** │ абвг │
└──────────────────────────────┴─────────────────────────┘
13. lower
将字符串中的 ASCII 拉丁字符转换为小写。
语法:
别名: lcase
参数:
-
input— 输入字符串。类型为字符串。
返回值:
-
转换为小写的字符串。类型为字符串。
示例:
SELECT lower('CLICKHOUSE');
结果:
┌─lower('CLICKHOUSE')─┐
│ clickhouse │
└─────────────────────┘
14. upper
将字符串中的 ASCII 拉丁字符转换为大写。
语法:
别名: ucase
参数:
-
input— 输入字符串。类型为字符串。
返回值:
-
转换为大写的字符串。类型为字符串。
示例:
SELECT upper('clickhouse');
结果:
┌─upper('clickhouse')─┐
│ CLICKHOUSE │
└─────────────────────┘
15. lowerUTF8
将字符串转换为小写,假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
注意:
-
不检测语言,例如对于土耳其语,结果可能不完全正确(
i/İvs.i/I)。 -
如果某个码点的大写和小写 UTF-8 字节序列长度不同(例如
ẞ和ß),则该码点的结果可能不正确。
语法:
参数:
-
input— 输入字符串。类型为字符串。
返回值:
-
转换为小写的字符串。类型为字符串。
示例:
SELECT lowerUTF8('MÜNCHEN') AS Lowerutf8;
结果:
┌─Lowerutf8─┐
│ münchen │
└───────────┘
16. upperUTF8
将字符串转换为大写,假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
注意:
-
不检测语言,例如对于土耳其语,结果可能不完全正确(
i/İvs.i/I)。 -
如果某个码点的大写和小写 UTF-8 字节序列长度不同(例如
ẞ和ß),则该码点的结果可能不正确。
语法:
参数:
-
input— 输入字符串。类型为字符串。
返回值:
-
转换为大写的字符串。类型为字符串。
示例:
SELECT upperUTF8('München') AS Upperutf8;
结果:
┌─Upperutf8─┐
│ MÜNCHEN │
└───────────┘
17. isValidUTF8
检查输入的字节序列是否为有效的 UTF-8 编码文本。
语法:
参数:
-
input— 输入字符串。类型为字符串。
返回值:
-
如果输入的字节序列为有效的 UTF-8 编码文本,返回
1;否则返回0。
示例:
SELECT isValidUTF8('\xc3\xb1') AS valid, isValidUTF8('\xc3\x28') AS invalid;
结果:
┌─valid─┬─invalid─┐
│ 1 │ 0 │
└───────┴─────────┘
18. toValidUTF8
将无效的 UTF-8 字符替换为 �(U+FFFD)字符。所有连续的无效字符将被压缩为一个替换字符。
语法:
toValidUTF8(input_string)
参数:
-
input_string— 任意字节序列,以字符串形式表示。
返回值:
-
有效的 UTF-8 字符串。
示例:
SELECT toValidUTF8('\x61\xF0\x80\x80\x80b');
结果:
┌─toValidUTF8('a����b')─┐
│ a�b │
└───────────────────────┘
19. repeat
将字符串重复指定的次数。
语法:
别名: REPEAT
参数:
-
s— 要重复的字符串。类型为字符串。 -
n— 重复的次数。类型为UInt或Int。
返回值:
-
包含字符串
s重复n次的结果字符串。如果n<= 0,函数返回空字符串。类型为字符串。
示例:
SELECT repeat('abc', 10);
结果:
┌─repeat('abc', 10)──────────────┐
│ abcabcabcabcabcabcabcabcabcabc │
└────────────────────────────────┘
20. space
将空格字符重复指定的次数。
语法:
别名: SPACE
参数:
-
n— 重复的次数。类型为UInt或Int。
返回值:
-
包含空格字符重复
n次的结果字符串。如果n<= 0,函数返回空字符串。类型为字符串。
示例:
SELECT space(3);
结果:
┌─space(3) ────┐
│ │
└──────────────┘
21. reverse
反转字符串中的字节序列。
22. reverseUTF8
反转字符串中的 Unicode 码点序列。假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
23. concat
将给定的参数连接成一个字符串。
语法:
参数:
-
任意类型的值。
返回值:
-
通过连接参数生成的字符串。
如果任何参数值为 NULL,函数返回 NULL。
示例:
SELECT concat('Hello, ', 'World!');
结果:
┌─concat('Hello, ', 'World!')─┐
│ Hello, World! │
└─────────────────────────────┘
24. concatAssumeInjective
与 concat 类似,但假设 concat(s1, s2, ...) → sn 是单射的。可用于优化 GROUP BY。
单射函数是指对于不同的输入,返回不同的结果。换句话说:不同的输入永远不会产生相同的结果。
语法:
concatAssumeInjective(s1, s2, ...)
参数:
-
类型为字符串或 FixedString 的值。
返回值:
-
通过连接参数生成的字符串。
如果任何参数值为 NULL,函数返回 NULL。
示例:
输入表:
CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog;
INSERT INTO key_val VALUES ('Hello, ','World',1), ('Hello, ','World',2), ('Hello, ','World!',3), ('Hello',', World!',2);
SELECT * from key_val;
结果:
┌─key1────┬─key2─────┬─value─┐
│ Hello, │ World │ 1 │
│ Hello, │ World │ 2 │
│ Hello, │ World! │ 3 │
│ Hello │ , World! │ 2 │
└─────────┴──────────┴───────┘
查询:
SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY concatAssumeInjective(key1, key2);
结果:
┌─concat(key1, key2)─┬─sum(value)─┐
│ Hello, World! │ 3 │
│ Hello, World! │ 2 │
│ Hello, World │ 3 │
└────────────────────┴────────────┘
25. concatWithSeparator
将给定的字符串用指定的分隔符连接。
语法:
concatWithSeparator(sep, expr1, expr2, expr3...)
别名: concat_ws
参数:
-
sep— 分隔符。类型为常量字符串或 FixedString。 -
exprN— 要连接的表达式。如果参数不是字符串或 FixedString 类型,则会使用其默认序列化方式转换为字符串。由于这会降低性能,因此不推荐使用非字符串/FixedString 类型的参数。
返回值:
-
通过连接参数生成的字符串。
如果任何参数值为 NULL,函数返回 NULL。
示例:
SELECT concatWithSeparator('a', '1', '2', '3', '4');
结果:
┌─concatWithSeparator('a', '1', '2', '3', '4')─┐
│ 1a2a3a4 │
└──────────────────────────────────────────────┘
26. concatWithSeparatorAssumeInjective
与 concatWithSeparator 类似,但假设 concatWithSeparator(sep, expr1, expr2, expr3...) → result 是单射的。可用于优化 GROUP BY。
单射函数是指对于不同的输入,返回不同的结果。换句话说:不同的输入永远不会产生相同的结果。
27. substring
返回字符串 s 的子字符串,从指定的字节索引 offset 开始。字节计数从 1 开始。如果 offset 为 0,则返回空字符串。如果 offset 为负数,则从字符串的末尾开始计算 pos 个字符,而不是从开头开始。可选参数 length 指定了返回子字符串的最大字节数。
语法:
substring(s, offset[, length])
别名:
-
substr -
mid -
byteSlice
参数:
-
s— 要计算子字符串的字符串。类型为字符串、FixedString 或 Enum。 -
offset— 子字符串在s中的起始位置。类型为(U)Int*。 -
length— 子字符串的最大长度。类型为(U)Int*。可选参数。
返回值:
-
从索引
offset开始的length字节的子字符串。类型为字符串。
示例:
SELECT 'database' AS db, substr(db, 5), substr(db, 5, 1);
结果:
┌─db───────┬─substring('database', 5)─┬─substring('database', 5, 1)─┐
│ database │ base │ b │
└──────────┴──────────────────────────┴─────────────────────────────┘
28. substringUTF8
返回字符串 s 的子字符串,从指定的字节索引 offset 开始,以 Unicode 码点为单位。字节计数从 1 开始。如果 offset 为 0,则返回空字符串。如果 offset 为负数,则从字符串的末尾开始计算 pos 个字符,而不是从开头开始。可选参数 length 指定了返回子字符串的最大字节数。
假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
语法:
substringUTF8(s, offset[, length])
参数:
-
s— 要计算子字符串的字符串。类型为字符串、FixedString 或 Enum。 -
offset— 子字符串在s中的起始位置。类型为(U)Int*。 -
length— 子字符串的最大长度。类型为(U)Int*。可选参数。
返回值:
-
从索引
offset开始的length字节的子字符串。
实现细节:
假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
示例:
SELECT 'Täglich grüßt das Murmeltier.' AS str,
substringUTF8(str, 9),
substringUTF8(str, 9, 5);
结果:
Täglich grüßt das Murmeltier. grüßt das Murmeltier. grüßt
29. substringIndex
返回字符串 s 在指定分隔符 delim 出现 count 次之前的子字符串,类似于 Spark 或 MySQL 的行为。
语法:
substringIndex(s, delim, count)
别名: SUBSTRING_INDEX
参数:
-
s— 要提取子字符串的字符串。类型为字符串。 -
delim— 分隔符。类型为字符串。 -
count— 分隔符出现的次数。如果count为正数,则从左侧开始计算,返回分隔符最后一次出现之前的所有内容。如果count为负数,则从右侧开始计算,返回分隔符最后一次出现之后的所有内容。类型为UInt或Int。
示例:
SELECT substringIndex('www.clickhouse.com', '.', 2);
结果:
复制
┌─substringIndex('www.clickhouse.com', '.', 2)─┐
│ www.clickhouse │
└──────────────────────────────────────────────┘
30. substringIndexUTF8
返回字符串 s 在指定分隔符 delim 出现 count 次之前的子字符串,以 Unicode 码点为单位。
假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
语法:
substringIndexUTF8(s, delim, count)
参数:
-
s— 要提取子字符串的字符串。类型为字符串。 -
delim— 分隔符。类型为字符串。 -
count— 分隔符出现的次数。如果count为正数,则从左侧开始计算,返回分隔符最后一次出现之前的所有内容。如果count为负数,则从右侧开始计算,返回分隔符最后一次出现之后的所有内容。类型为UInt或Int。
返回值:
-
在分隔符出现
count次之前的子字符串。类型为字符串。
实现细节:
假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
示例:
SELECT substringIndexUTF8('www.straßen-in-europa.de', '.', 2);
31. appendTrailingCharIfAbsent
如果字符串 s 非空且不以字符 c 结尾,则在字符串 s 的末尾追加字符 c。
语法:
appendTrailingCharIfAbsent(s, c)
32. convertCharset
将字符串 s 从编码 from 转换为编码 to。
语法:
convertCharset(s, from, to)
33. base58Encode
使用 Base58 编码(“Bitcoin” 字母表)对字符串进行编码。
语法:
参数:
-
plaintext— 字符串列或常量。
返回值:
-
包含参数编码值的字符串。类型为字符串或 FixedString。
示例:
sql复制
SELECT base58Encode('Encoded');
结果:
复制
┌─base58Encode('Encoded')─┐
│ 3dc8KtHrwM │
└─────────────────────────┘
34. base58Decode
接受一个字符串,并使用 Base58 编码方案(“Bitcoin” 字母表)对其进行解码。
语法:
参数:
-
encoded— 字符串或 FixedString。如果字符串不是有效的 Base58 编码值,则会抛出异常。
返回值:
-
包含参数解码值的字符串。类型为字符串。
示例:
sql复制
SELECT base58Decode('3dc8KtHrwM');
结果:
复制
┌─base58Decode('3dc8KtHrwM')─┐
│ Encoded │
└────────────────────────────┘
35. tryBase58Decode
与 base58Decode 类似,但在发生错误时返回空字符串。
语法:
参数:
-
encoded— 字符串或 FixedString。如果字符串不是有效的 Base58 编码值,则返回空字符串。
返回值:
-
包含参数解码值的字符串。
示例:
sql复制
SELECT tryBase58Decode('3dc8KtHrwM') as res, tryBase58Decode('invalid') as res_invalid;
结果:
复制
┌─res─────┬─res_invalid─┐
│ Encoded │ │
└─────────┴─────────────┘
36. base64Encode
根据 RFC 4648,将字符串或 FixedString 以 Base64 编码。
别名: TO_BASE64
语法:
参数:
-
plaintext— 字符串列或常量。
返回值:
-
包含参数编码值的字符串。
示例:
sql复制
SELECT base64Encode('clickhouse');
结果:
复制
┌─base64Encode('clickhouse')─┐
│ Y2xpY2tob3VzZQ== │
└────────────────────────────┘
37. base64URLEncode
根据 RFC 4648,将 URL(字符串或 FixedString)以 Base64 编码,并进行 URL 特定的修改。
语法:
参数:
-
url— 字符串列或常量。
返回值:
-
包含参数编码值的字符串。
示例:
sql复制
SELECT base64URLEncode('https://clickhouse.com');
结果:
复制
┌─base64URLEncode('https://clickhouse.com')─┐
│ aHR0cDovL2NsaWNraG91c2UuY29t │
└───────────────────────────────────────────┘
38. base64Decode
根据 RFC 4648,接受一个字符串并从 Base64 中解码。如果发生错误,将抛出异常。
别名: FROM_BASE64
语法:
参数:
-
encoded— 字符串列或常量。如果字符串不是有效的 Base64 编码值,则会抛出异常。
返回值:
-
包含参数解码值的字符串。
示例:
sql复制
SELECT base64Decode('Y2xpY2tob3VzZQ==');
结果:
复制
┌─base64Decode('Y2xpY2tob3VzZQ==')─┐
│ clickhouse │
└──────────────────────────────────┘
39. base64URLDecode
根据 RFC 4648,接受一个 Base64 编码的 URL 并解码,进行 URL 特定的修改。如果发生错误,将抛出异常。
语法:
sql复制
base64URLDecode(encodedUrl)
参数:
-
encodedURL— 字符串列或常量。如果字符串不是具有 URL 特定修改的 Base64 编码值,则会抛出异常。
返回值:
-
包含参数解码值的字符串。
示例:
sql复制
SELECT base64URLDecode('aHR0cDovL2NsaWNraG91c2UuY29t');
结果:
复制
┌─base64URLDecode('aHR0cDovL2NsaWNraG91c2UuY29t')─┐
│ https://clickhouse.com │
└─────────────────────────────────────────────────┘
40. tryBase64Decode
与 base64Decode 类似,但在发生错误时返回空字符串。
语法:
参数:
-
encoded— 字符串列或常量。如果字符串不是有效的 Base64 编码值,则返回空字符串。
返回值:
-
包含参数解码值的字符串。
示例:
sql复制
SELECT tryBase64Decode('RW5jb2RlZA==') as res, tryBase64Decode('invalid') as res_invalid;
结果:
复制
┌─res────────┬─res_invalid─┐
│ clickhouse │ │
└────────────┴─────────────┘
41. tryBase64URLDecode
与 base64URLDecode 类似,但在发生错误时返回空字符串。
语法:
sql复制
tryBase64URLDecode(encodedUrl)
参数:
-
encodedURL— 字符串列或常量。如果字符串不是具有 URL 特定修改的 Base64 编码值,则返回空字符串。
返回值:
-
包含参数解码值的字符串。
示例:
sql复制
SELECT tryBase64URLDecode('aHR0cDovL2NsaWNraG91c2UuY29t') as res, tryBase64Decode('aHR0cHM6Ly9jbGlja') as res_invalid;
结果:
复制
┌─res────────────────────┬─res_invalid─┐
│ https://clickhouse.com │ │
└────────────────────────┴─────────────┘
42. endsWith
检查字符串 str 是否以 suffix 结尾。
语法:
sql复制
endsWith(str, suffix)
示例:
sql复制
SELECT endsWith('Spider-Man', 'Man');
结果:
复制
┌─endsWith('Spider-Man', 'Man')─┐
│ 1 │
└──────────────────────────────┘
43. endsWithUTF8
检查字符串 str 是否以 suffix 结尾。与 endsWith 不同,endsWithUTF8 按 UTF-8 字符匹配 str 和 suffix。
语法:
sql复制
endsWithUTF8(str, suffix)
示例:
sql复制
SELECT endsWithUTF8('中国', '\xbd'), endsWith('中国', '\xbd');
结果:
复制
┌─endsWithUTF8('中国', '½')─┬─endsWith('中国', '½')─┐
│ 0 │ 1 │
└──────────────────────────┴──────────────────────┘
44. startsWith
检查字符串 str 是否以 prefix 开头。
语法:
sql复制
startsWith(str, prefix)
示例:
sql复制
SELECT startsWith('Spider-Man', 'Spi');
结果:
复制
┌─startsWith('Spider-Man', 'Spi')─┐
│ 1 │
└────────────────────────────────┘
45. startsWithUTF8
从版本 23.8 开始可用
检查字符串 str 是否以 prefix 开头。与 startsWith 不同,startsWithUTF8 按 UTF-8 字符匹配 str 和 suffix。
示例:
sql复制
SELECT startsWithUTF8('中国', '\xe4'), startsWith('中国', '\xe4');
结果:
复制
┌─startsWithUTF8('中国', '⥩─┬─startsWith('中国', '⥩─┐
│ 0 │ 1 │
└────────────────────────────┴────────────────────────┘
46. trim
从字符串的开头或结尾删除指定的字符。如果不指定其他内容,则默认删除空格(ASCII 字符 32)。
语法:
sql复制
trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string)
参数:
-
trim_character— 要删除的指定字符。类型为字符串。 -
input_string— 要处理的字符串。类型为字符串。
返回值:
-
删除了指定字符的字符串。类型为字符串。
示例:
sql复制
SELECT trim(BOTH ' ()' FROM '( Hello, world! )');
结果:
复制
┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐
│ Hello, world! │
└───────────────────────────────────────────────┘
47. trimLeft
从字符串的开头删除连续的空格(ASCII 字符 32)。
语法:
别名: ltrim(input_string)
参数:
-
input_string— 要处理的字符串。类型为字符串。
返回值:
-
删除了开头空格的字符串。类型为字符串。
示例:
sql复制
SELECT trimLeft(' Hello, world! ');
结果:
复制
┌─trimLeft(' Hello, world! ')─┐
│ Hello, world! │
└─────────────────────────────────────┘
48. trimRight
从字符串的结尾删除连续的空格(ASCII 字符 32)。
语法:
别名: rtrim(input_string)
参数:
-
input_string— 要处理的字符串。类型为字符串。
返回值:
-
删除了结尾空格的字符串。类型为字符串。
示例:
sql复制
SELECT trimRight(' Hello, world! ');
结果:
复制
┌─trimRight(' Hello, world! ')─┐
│ Hello, world! │
└──────────────────────────────────────┘
49. trimBoth
从字符串的开头和结尾删除连续的空格(ASCII 字符 32)。
语法:
别名: trim(input_string)
参数:
-
input_string— 要处理的字符串。类型为字符串。
返回值:
-
删除了开头和结尾空格的字符串。类型为字符串。
示例:
sql复制
SELECT trimBoth(' Hello, world! ');
结果:
复制
┌─trimBoth(' Hello, world! ')─┐
│ Hello, world! │
└─────────────────────────────────────┘
50. CRC32
返回字符串的 CRC32 校验和,使用 CRC-32-IEEE 802.3 多项式和初始值 0xffffffff(zlib 实现)。
返回值类型为 UInt32。
51. CRC32IEEE
返回字符串的 CRC32 校验和,使用 CRC-32-IEEE 802.3 多项式。
返回值类型为 UInt32。
52. CRC64
返回字符串的 CRC64 校验和,使用 CRC-64-ECMA 多项式。
返回值类型为 UInt64。
53. normalizeQuery
将查询中的字面量、字面量序列以及复杂的别名(包含空格、超过两个数字或至少 36 字节长的别名,例如 UUID)替换为占位符 ?。
语法:
参数:
-
x— 字符序列。类型为字符串。
返回值:
-
包含占位符的字符序列。类型为字符串。
示例:
sql复制
SELECT normalizeQuery('[1, 2, 3, x]') AS query;
结果:
复制
┌─query────┐
│ [?.., x] │
└──────────┘
54. normalizeQueryKeepNames
与 normalizeQuery 类似,将查询中的字面量和字面量序列替换为占位符 ?,但不会替换复杂的别名(包含空格、超过两个数字或至少 36 字节长的别名,例如 UUID)。这有助于更好地分析复杂的查询日志。
语法:
sql复制
normalizeQueryKeepNames(x)
参数:
-
x— 字符序列。类型为字符串。
返回值:
-
包含占位符的字符序列。类型为字符串。
示例:
sql复制
SELECT normalizeQuery('SELECT 1 AS aComplexName123'), normalizeQueryKeepNames('SELECT 1 AS aComplexName123');
结果:
复制
┌─normalizeQuery('SELECT 1 AS aComplexName123')─┬─normalizeQueryKeepNames('SELECT 1 AS aComplexName123')─┐
│ SELECT ? AS `?` │ SELECT ? AS aComplexName123 │
└───────────────────────────────────────────────┴────────────────────────────────────────────────────────┘
55. normalizedQueryHash
为类似的查询返回相同的 64 位哈希值,而不考虑字面量的值。这有助于分析查询日志。
语法:
参数:
-
x— 字符序列。类型为字符串。
返回值:
-
哈希值。类型为
UInt64。
示例:
sql复制
SELECT normalizedQueryHash('SELECT 1 AS `xyz`') != normalizedQueryHash('SELECT 1 AS `abc`') AS res;
结果:
复制
┌─res─┐
│ 0 │
└─────┘
56. normalizedQueryHashKeepNames
与 normalizedQueryHash 类似,为类似的查询返回相同的 64 位哈希值,但不会将复杂的别名(包含空格、超过两个数字或至少 36 字节长的别名,例如 UUID)替换为占位符后再进行哈希。这有助于分析查询日志。
语法:
sql复制
normalizedQueryHashKeepNames(x)
参数:
-
x— 字符序列。类型为字符串。
返回值:
-
哈希值。类型为
UInt64。
示例:
sql复制
SELECT normalizedQueryHash('SELECT 1 AS `xyz123`') != normalizedQueryHash('SELECT 1 AS `abc123`') AS normalizedQueryHash;
SELECT normalizedQueryHashKeepNames('SELECT 1 AS `xyz123`') != normalizedQueryHashKeepNames('SELECT 1 AS `abc123`') AS normalizedQueryHashKeepNames;
结果:
复制
┌─normalizedQueryHash─┐
│ 0 │
└─────────────────────┘
┌─normalizedQueryHashKeepNames─┐
│ 1 │
└──────────────────────────────┘
57. normalizeUTF8NFC
将字符串转换为 NFC 标准化形式,假设字符串是有效的 UTF-8 编码文本。
语法:
参数:
-
words— UTF-8 编码的输入字符串。类型为字符串。
返回值:
-
转换为 NFC 标准化形式的字符串。类型为字符串。
示例:
sql复制
SELECT length('â'), normalizeUTF8NFC('â') AS nfc, length(nfc) AS nfc_len;
结果:
复制
┌─length('â')─┬─nfc─┬─nfc_len─┐
│ 2 │ â │ 2 │
└─────────────┴─────┴─────────┘
58. normalizeUTF8NFD
将字符串转换为 NFD 标准化形式,假设字符串是有效的 UTF-8 编码文本。
语法:
参数:
-
words— UTF-8 编码的输入字符串。类型为字符串。
返回值:
-
转换为 NFD 标准化形式的字符串。类型为字符串。
示例:
sql复制
SELECT length('â'), normalizeUTF8NFD('â') AS nfd, length(nfd) AS nfd_len;
结果:
复制
┌─length('â')─┬─nfd─┬─nfd_len─┐
│ 2 │ â │ 3 │
└─────────────┴─────┴─────────┘
59. normalizeUTF8NFKC
将字符串转换为 NFKC 标准化形式,假设字符串是有效的 UTF-8 编码文本。
语法:
参数:
-
words— UTF-8 编码的输入字符串。类型为字符串。
返回值:
-
转换为 NFKC 标准化形式的字符串。类型为字符串。
示例:
sql复制
SELECT length('â'), normalizeUTF8NFKC('â') AS nfkc, length(nfkc) AS nfkc_len;
结果:
复制
┌─length('â')─┬─nfkc─┬─nfkc_len─┐
│ 2 │ â │ 2 │
└─────────────┴──────┴──────────┘
60. normalizeUTF8NFKD
将字符串转换为 NFKD 标准化形式,假设字符串是有效的 UTF-8 编码文本。
语法:
参数:
-
words— UTF-8 编码的输入字符串。类型为字符串。
返回值:
-
转换为 NFKD 标准化形式的字符串。类型为字符串。
示例:
sql复制
SELECT length('â'), normalizeUTF8NFKD('â') AS nfkd, length(nfkd) AS nfkd_len;
结果:
复制
┌─length('â')─┬─nfkd─┬─nfkd_len─┐
│ 2 │ â │ 3 │
└─────────────┴──────┴──────────┘
61. encodeXMLComponent
将具有特殊含义的字符转义,以便后续可以将其放入 XML 文本节点或属性中。
以下字符将被替换:<、&、>、"、'。
语法:
参数:
-
x— 输入字符串。类型为字符串。
返回值:
-
转义后的字符串。类型为字符串。
示例:
SELECT encodeXMLComponent('Hello, "world"!');
SELECT encodeXMLComponent('<123>');
SELECT encodeXMLComponent('&clickhouse');
SELECT encodeXMLComponent('\'foo\'');
结果:
Hello, "world"!
<123>
&clickhouse
'foo'
62. decodeXMLComponent
反转具有特殊含义的子字符串。这些子字符串包括:"、&、'、>、<。
此函数还将数字字符引用替换为 Unicode 字符。支持十进制(如 ✓)和十六进制(✓)形式。
语法:
参数:
-
x— 输入字符串。类型为字符串。
返回值:
-
反转后的字符串。类型为字符串。
示例:
SELECT decodeXMLComponent(''foo'');
SELECT decodeXMLComponent('< Σ >');
63. decodeHTMLComponent
反转具有特殊含义的 HTML 子字符串。例如:ℏ、>、♦、♥、< 等。
此函数还将数字字符引用替换为 Unicode 字符。支持十进制(如 ✓)和十六进制(✓)形式。
语法:
参数:
-
x— 输入字符串。类型为字符串。
返回值:
-
反转后的字符串。类型为字符串。
示例:
sql复制
SELECT decodeHTMLComponent('CH');
SELECT decodeHTMLComponent('I♥ClickHouse');
64. extractTextFromHTML
从 HTML 或 XHTML 中提取纯文本。
该函数的实现并不完全符合 HTML、XML 或 XHTML 规范,但其规则合理且执行效率较高。具体规则如下:
-
注释被跳过。例如:
<!-- test -->。注释必须以-->结尾。不允许嵌套注释。-
注意:
<!-->和<!--->在 HTML 中不是有效的注释,但它们会被其他规则跳过。
-
-
CDATA 按原样粘贴。注意:CDATA 是 XML/XHTML 特有的,处理方式为“尽力而为”。
-
script和style元素及其所有内容将被删除。-
注意:假设关闭标签不会出现在内容中。例如,JS 字符串字面量必须转义为
<\/script>。 -
注意:在
script或style内部允许出现注释和 CDATA — 然后关闭标签不会在 CDATA 内部搜索。例如:<script><![CDATA[</script>]]></script>。但它们仍然会在注释内部搜索。有时会变得复杂:<script>var x = "<!--"; </script> var y = "-->"; alert(x + y);</script> -
注意:
script和style可以是 XML 命名空间的名称 — 然后它们不会被视为普通的script或style元素。例如:<script:a>Hello</script:a>。 -
注意:关闭标签名称后允许出现空格:
</script >,但不允许出现空格:< / script>。
-
-
其他标签或类似标签的元素将被跳过,不包括内部内容。例如:
<a>.</a>。-
注意:预期这种 HTML 是非法的:
<a test=">"></a>。 -
注意:它还会跳过类似标签的内容:
<>、<!>等。 -
注意:没有结束标签的标签将被跳过,直到输入结束:
<hello
-
-
HTML 和 XML 实体不会被解码。它们必须通过单独的函数处理。
-
文本中的空格按特定规则折叠或插入。
-
开头和结尾的空格将被删除。
-
连续的空格将被折叠。
-
但如果文本被其他元素分隔且没有空格,则会插入空格。
-
这可能会导致不自然的例子:
Hello<b>world</b>、Hello<!-- -->world— HTML 中没有空格,但该函数会插入空格。还可以考虑:Hello<p>world</p>、Hello<br>world。这种行为对于数据分析是合理的,例如将 HTML 转换为词袋。
-
-
还要注意,正确处理空格需要支持
<pre></pre>以及 CSS 的display和white-space属性。
语法:
参数:
-
x— 输入文本。类型为字符串。
返回值:
-
提取的文本。类型为字符串。
示例:
第一个示例包含多个标签和注释,并展示了空格处理。
第二个示例展示了 CDATA 和 script 标签的处理。
第三个示例从通过 url 函数收到的完整 HTML 响应中提取文本。
SELECT extractTextFromHTML(' <p> A text <i>with</i><b>tags</b>. <!-- comments --> </p> ');
SELECT extractTextFromHTML('<![CDATA[The content within <b>CDATA</b>]]> <script>alert("Script");</script>');
SELECT extractTextFromHTML(html) FROM url('http://www.donothingfor2minutes.com/', RawBLOB, 'html String');
结果:
A text with tags .
The content within <b>CDATA</b>
Do Nothing for 2 Minutes 2:00
65. ascii
返回字符串 s 中第一个字符的 ASCII 码点值(类型为 Int32)。
如果 s 为空,则结果为 0。如果第一个字符不是 ASCII 字符或不在 UTF-16 的拉丁语补充范围
语法:
ascii(s)
抱歉,我之前的回答没有完整覆盖所有内容。以下是剩余部分的翻译和总结:
66. soundex
返回字符串的 Soundex 代码。
语法:
soundex(val)
参数:
-
val— 输入值。类型为字符串。
返回值:
-
输入值的 Soundex 代码。类型为字符串。
示例:
sql复制
SELECT soundex('aksel');
结果:
复制
┌─soundex('aksel')─┐
│ A240 │
└──────────────────┘
67. punycodeEncode
返回字符串的 Punycode 表示形式。
语法:
sql复制
punycodeEncode(val)
参数:
-
val— 输入值。类型为字符串。
返回值:
-
输入值的 Punycode 表示形式。类型为字符串。
示例:
sql复制
SELECT punycodeEncode('München');
结果:
复制
┌─punycodeEncode('München')─┐
│ Mnchen-3ya │
└───────────────────────────┘
68. punycodeDecode
返回 Punycode 编码字符串的 UTF-8 编码纯文本。
语法:
sql复制
punycodeDecode(val)
参数:
-
val— Punycode 编码的字符串。类型为字符串。
返回值:
-
输入值的纯文本。类型为字符串。
示例:
sql复制
SELECT punycodeDecode('Mnchen-3ya');
结果:
复制
┌─punycodeDecode('Mnchen-3ya')─┐
│ München │
└──────────────────────────────┘
69. tryPunycodeDecode
与 punycodeDecode 类似,但如果输入不是有效的 Punycode 编码字符串,则返回空字符串。
70. idnaEncode
根据国际化域名应用(IDNA)机制,返回域名的 ASCII 表示形式(ToASCII 算法)。
语法:
sql复制
idnaEncode(val)
参数:
-
val— 输入值。类型为字符串。
返回值:
-
输入值的 ASCII 表示形式。类型为字符串。
示例:
sql复制
SELECT idnaEncode('straße.münchen.de');
结果:
复制
┌─idnaEncode('straße.münchen.de')─────┐
│ xn--strae-oqa.xn--mnchen-3ya.de │
└─────────────────────────────────────┘
71. tryIdnaEncode
与 idnaEncode 类似,但如果发生错误,则返回空字符串而不是抛出异常。
72. idnaDecode
根据国际化域名应用(IDNA)机制,返回域名的 Unicode(UTF-8)表示形式(ToUnicode 算法)。
语法:
sql复制
idnaDecode(val)
参数:
-
val— 输入值。类型为字符串。
返回值:
-
输入值的 Unicode(UTF-8)表示形式。类型为字符串。
示例:
sql复制
SELECT idnaDecode('xn--strae-oqa.xn--mnchen-3ya.de');
结果:
复制
┌─idnaDecode('xn--strae-oqa.xn--mnchen-3ya.de')─┐
│ straße.münchen.de │
└───────────────────────────────────────────────┘
73. byteHammingDistance
计算两个字节字符串之间的汉明距离。
语法:
sql复制
byteHammingDistance(string1, string2)
示例:
sql复制
SELECT byteHammingDistance('karolin', 'kathrin');
结果:
复制
┌─byteHammingDistance('karolin', 'kathrin')─┐
│ 3 │
└───────────────────────────────────────────┘
别名: mismatches
74. stringJaccardIndex
计算两个字节字符串之间的 Jaccard 相似度指数。
语法:
sql复制
stringJaccardIndex(string1, string2)
示例:
sql复制
SELECT stringJaccardIndex('clickhouse', 'mouse');
结果:
复制
┌─stringJaccardIndex('clickhouse', 'mouse')─┐
│ 0.4 │
└───────────────────────────────────────────┘
75. stringJaccardIndexUTF8
与 stringJaccardIndex 类似,但针对 UTF-8 编码的字符串。
76. editDistance
计算两个字节字符串之间的编辑距离。
语法:
sql复制
editDistance(string1, string2)
示例:
sql复制
SELECT editDistance('clickhouse', 'mouse');
结果:
复制
┌─editDistance('clickhouse', 'mouse')─┐
│ 6 │
└─────────────────────────────────────┘
别名: levenshteinDistance
77. editDistanceUTF8
计算两个 UTF-8 字符串之间的编辑距离。
语法:
sql复制
editDistanceUTF8(string1, string2)
示例:
sql复制
SELECT editDistanceUTF8('我是谁', '我是我');
结果:
复制
┌─editDistanceUTF8('我是谁', '我是我')──┐
│ 1 │
└─────────────────────────────────────┘
别名: levenshteinDistanceUTF8
78. damerauLevenshteinDistance
计算两个字节字符串之间的 Damerau-Levenshtein 距离。
语法:
sql复制
damerauLevenshteinDistance(string1, string2)
示例:
sql复制
SELECT damerauLevenshteinDistance('clickhouse', 'mouse');
结果:
复制
┌─damerauLevenshteinDistance('clickhouse', 'mouse')─┐
│ 6 │
└───────────────────────────────────────────────────┘
79. jaroSimilarity
计算两个字节字符串之间的 Jaro 相似度。
语法:
sql复制
jaroSimilarity(string1, string2)
示例:
sql复制
SELECT jaroSimilarity('clickhouse', 'click');
结果:
复制
┌─jaroSimilarity('clickhouse', 'click')─┐
│ 0.8333333333333333 │
└───────────────────────────────────────┘
80. jaroWinklerSimilarity
计算两个字节字符串之间的 Jaro-Winkler 相似度。
语法:
sql复制
jaroWinklerSimilarity(string1, string2)
示例:
sql复制
SELECT jaroWinklerSimilarity('clickhouse', 'click');
结果:
复制
┌─jaroWinklerSimilarity('clickhouse', 'click')─┐
│ 0.8999999999999999 │
└──────────────────────────────────────────────┘
81. initcap
将每个单词的首字母转换为大写,其余字母转换为小写。单词是由非字母数字字符分隔的字母数字字符序列。
注意:
由于 initcap 只将每个单词的首字母转换为大写,因此对于包含撇号或大写字母的单词,可能会出现意外行为。例如:
sql复制
SELECT initCap('mother''s daughter'), initCap('joe McAdam');
将返回:
复制
┌─initCap('mother\'s daughter')─┬─initCap('joe McAdam')─┐
│ Mother'S Daughter │ Joe Mcadam │
└───────────────────────────────┴───────────────────────┘
这是一种已知行为,目前没有计划修复。
语法:
参数:
-
val— 输入值。类型为字符串。
返回值:
-
将每个单词的首字母转换为大写的字符串。类型为字符串。
示例:
sql复制
SELECT initcap('building for fast');
结果:
复制
┌─initcap('building for fast')─┐
│ Building For Fast │
└──────────────────────────────┘
82. initcapUTF8
与 initcap 类似,initcapUTF8 将每个单词的首字母转换为大写,其余字母转换为小写。假设字符串包含有效的 UTF-8 编码文本。如果违反此假设,不会抛出异常,结果未定义。
注意:
该函数不检测语言,例如对于土耳其语,结果可能不完全正确(i/İ vs. i/I)。如果某个码点的大写和小写 UTF-8 字节序列长度不同,则该码点的结果可能不正确。
语法:
参数:
-
val— 输入值。类型为字符串。
返回值:
-
将每个单词的首字母转换为大写的字符串。类型为字符串。
示例:
sql复制
SELECT initcapUTF8('не тормозит');
结果:
复制
┌─initcapUTF8('не тормозит')─┐
│ Не Тормозит │
└────────────────────────────┘
83. firstLine
从多行字符串中返回第一行。
语法:
参数:
-
val— 输入值。类型为字符串。
返回值:
-
输入值的第一行,如果没有换行符,则返回整个字符串。类型为字符串。
示例:
sql复制
SELECT firstLine('foo\nbar\nbaz');
结果:
复制
┌─firstLine('foo\nbar\nbaz')─┐
│ foo │
└────────────────────────────┘
总结
以上是 ClickHouse 中用于字符串操作的主要函数,涵盖了字符串的检查、转换、编码、解码、相似度计算、格式化以及提取等功能。这些函数不仅适用于 ASCII 字符串,还支持 UTF-8 编码的 Unicode 字符串,能够满足多种复杂的字符串处理需求。
4万+

被折叠的 条评论
为什么被折叠?



