ClickHouse 字符串操作函数

字符串操作函数

本文主要涉及 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_LENGTHCHARACTER_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 — 结果字符串的长度。类型为 UIntInt。如果该值小于输入字符串的长度,则输入字符串将被缩短为 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 — 结果字符串的长度。类型为 UIntInt。如果该值小于输入字符串的长度,则输入字符串将被缩短为 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 — 结果字符串的长度。类型为 UIntInt。如果该值小于输入字符串的长度,则输入字符串将被缩短为 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 — 结果字符串的长度。类型为 UIntInt。如果该值小于输入字符串的长度,则输入字符串将被缩短为 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 — 重复的次数。类型为 UIntInt

返回值:

  • 包含字符串 s 重复 n 次的结果字符串。如果 n <= 0,函数返回空字符串。类型为字符串。

示例:

SELECT repeat('abc', 10);

结果:

┌─repeat('abc', 10)──────────────┐
│ abcabcabcabcabcabcabcabcabcabc │
└────────────────────────────────┘

20. space

将空格字符重复指定的次数。

语法:

别名: SPACE

参数:

  • n — 重复的次数。类型为 UIntInt

返回值:

  • 包含空格字符重复 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 为负数,则从右侧开始计算,返回分隔符最后一次出现之后的所有内容。类型为 UIntInt

示例:

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 为负数,则从右侧开始计算,返回分隔符最后一次出现之后的所有内容。类型为 UIntInt

返回值:

  • 在分隔符出现 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 字符匹配 strsuffix

语法:

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 字符匹配 strsuffix

示例:

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, &quot;world&quot;!
&lt;123&gt;
&amp;clickhouse
&apos;foo&apos;

62. decodeXMLComponent

反转具有特殊含义的子字符串。这些子字符串包括:&quot;&amp;&apos;&gt;&lt;

此函数还将数字字符引用替换为 Unicode 字符。支持十进制(如 &#10003;)和十六进制(&#x2713;)形式。

语法:

参数:

  • x — 输入字符串。类型为字符串。

返回值:

  • 反转后的字符串。类型为字符串。

示例:

SELECT decodeXMLComponent('&apos;foo&apos;');
SELECT decodeXMLComponent('&lt; &#x3A3; &gt;');

63. decodeHTMLComponent

反转具有特殊含义的 HTML 子字符串。例如:&hbar;&gt;&diamondsuit;&heartsuit;&lt; 等。

此函数还将数字字符引用替换为 Unicode 字符。支持十进制(如 &#10003;)和十六进制(&#x2713;)形式。

语法:

参数:

  • x — 输入字符串。类型为字符串。

返回值:

  • 反转后的字符串。类型为字符串。

示例:

sql复制

SELECT decodeHTMLComponent('CH');
SELECT decodeHTMLComponent('I&heartsuit;ClickHouse');

64. extractTextFromHTML

从 HTML 或 XHTML 中提取纯文本。

该函数的实现并不完全符合 HTML、XML 或 XHTML 规范,但其规则合理且执行效率较高。具体规则如下:

  1. 注释被跳过。例如:<!-- test -->。注释必须以 --> 结尾。不允许嵌套注释。

    • 注意:<!--><!---> 在 HTML 中不是有效的注释,但它们会被其他规则跳过。

  2. CDATA 按原样粘贴。注意:CDATA 是 XML/XHTML 特有的,处理方式为“尽力而为”。

  3. scriptstyle 元素及其所有内容将被删除。

    • 注意:假设关闭标签不会出现在内容中。例如,JS 字符串字面量必须转义为 <\/script>

    • 注意:在 scriptstyle 内部允许出现注释和 CDATA — 然后关闭标签不会在 CDATA 内部搜索。例如:<script><![CDATA[</script>]]></script>。但它们仍然会在注释内部搜索。有时会变得复杂:<script>var x = "<!--"; </script> var y = "-->"; alert(x + y);</script>

    • 注意:scriptstyle 可以是 XML 命名空间的名称 — 然后它们不会被视为普通的 scriptstyle 元素。例如:<script:a>Hello</script:a>

    • 注意:关闭标签名称后允许出现空格:</script >,但不允许出现空格:< / script>

  4. 其他标签或类似标签的元素将被跳过,不包括内部内容。例如:<a>.</a>

    • 注意:预期这种 HTML 是非法的:<a test=">"></a>

    • 注意:它还会跳过类似标签的内容:<><!> 等。

    • 注意:没有结束标签的标签将被跳过,直到输入结束:<hello

  5. HTML 和 XML 实体不会被解码。它们必须通过单独的函数处理。

  6. 文本中的空格按特定规则折叠或插入。

    • 开头和结尾的空格将被删除。

    • 连续的空格将被折叠。

    • 但如果文本被其他元素分隔且没有空格,则会插入空格。

    • 这可能会导致不自然的例子:Hello<b>world</b>Hello<!-- -->world — HTML 中没有空格,但该函数会插入空格。还可以考虑:Hello<p>world</p>Hello<br>world。这种行为对于数据分析是合理的,例如将 HTML 转换为词袋。

  7. 还要注意,正确处理空格需要支持 <pre></pre> 以及 CSS 的 displaywhite-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 &nbsp;

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 字符串,能够满足多种复杂的字符串处理需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值