字符串分割函数
splitByChar
将字符串分割成以指定字符分隔的子字符串。使用包含单个字符的常量字符串 separator
。返回选定的子字符串数组。如果分隔符出现在字符串的开头或结尾,或者存在多个连续的分隔符,则可能会选择空子字符串。
语法
splitByChar(separator, s[, max_substrings]))
参数
separator
— 分隔符,必须包含一个字符。 字符串.s
— 要分割的字符串。 字符串.max_substrings
— 可选的Int64
,默认值为 0。如果max_substrings
> 0,则返回的数组将包含不超过max_substrings
个子字符串,否则函数将返回尽可能多的子字符串。
返回值
参数 max_substrings
的行为从 ClickHouse v22.11 开始发生变化。在早于该版本的版本中,max_substrings > 0
表示执行了 max_substring
次分割,并将字符串的剩余部分作为列表的最后一个元素返回。例如,
- 在 v22.10 中:
SELECT splitByChar('=', 'a=b=c=d', 2);
返回['a','b','c=d']
- 在 v22.11 中:
SELECT splitByChar('=', 'a=b=c=d', 2);
返回['a','b']
可以通过设置 splitby_max_substrings_includes_remaining_string 来实现与 ClickHouse v22.11 之前类似的行为。SELECT splitByChar('=', 'a=b=c=d', 2) SETTINGS splitby_max_substrings_includes_remaining_string = 1 -- ['a', 'b=c=d']
示例
SELECT splitByChar(',', '1,2,3,abcde');
结果
┌─splitByChar(',', '1,2,3,abcde')─┐
│ ['1','2','3','abcde'] │
└─────────────────────────────────┘
splitByString
将字符串分割成以字符串分隔的子字符串。它使用包含多个字符的常量字符串 separator
作为分隔符。如果字符串 separator
为空,它将把字符串 s
分割成一个单字符数组。
语法
splitByString(separator, s[, max_substrings]))
参数
separator
— 分隔符。 字符串.s
— 要分割的字符串。 字符串.max_substrings
— 可选的Int64
,默认值为 0。当max_substrings
> 0 时,返回的子字符串将不超过max_substrings
个,否则函数将返回尽可能多的子字符串。
返回值
当以下情况发生时,可能会选择空子字符串
- 非空分隔符出现在字符串的开头或结尾;
- 存在多个连续的非空分隔符;
- 原始字符串
s
为空,而分隔符不为空。
设置 splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings
> 0 时,是否将剩余字符串包含在结果数组的最后一个元素中。
示例
SELECT splitByString(', ', '1, 2 3, 4,5, abcde');
结果
┌─splitByString(', ', '1, 2 3, 4,5, abcde')─┐
│ ['1','2 3','4,5','abcde'] │
└───────────────────────────────────────────┘
SELECT splitByString('', 'abcde');
结果
┌─splitByString('', 'abcde')─┐
│ ['a','b','c','d','e'] │
└────────────────────────────┘
splitByRegexp
将字符串分割成以正则表达式分隔的子字符串。它使用正则表达式字符串 regexp
作为分隔符。如果 regexp
为空,它将把字符串 s
分割成一个单字符数组。如果找不到与该正则表达式匹配的项,则不会分割字符串 s
。
语法
splitByRegexp(regexp, s[, max_substrings]))
参数
regexp
— 正则表达式。常量。 字符串 或 固定字符串.s
— 要分割的字符串。 字符串.max_substrings
— 可选的Int64
,默认值为 0。当max_substrings
> 0 时,返回的子字符串将不超过max_substrings
个,否则函数将返回尽可能多的子字符串。
返回值
当以下情况发生时,可能会选择空子字符串
- 非空正则表达式匹配出现在字符串的开头或结尾;
- 存在多个连续的非空正则表达式匹配;
- 原始字符串
s
为空,而正则表达式不为空。
设置 splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings
> 0 时,是否将剩余字符串包含在结果数组的最后一个元素中。
示例
SELECT splitByRegexp('\\d+', 'a12bc23de345f');
结果
┌─splitByRegexp('\\d+', 'a12bc23de345f')─┐
│ ['a','bc','de','f'] │
└────────────────────────────────────────┘
SELECT splitByRegexp('', 'abcde');
结果
┌─splitByRegexp('', 'abcde')─┐
│ ['a','b','c','d','e'] │
└────────────────────────────┘
splitByWhitespace
将字符串分割成以空格字符分隔的子字符串。返回选定的子字符串数组。
语法
splitByWhitespace(s[, max_substrings]))
参数
s
— 要分割的字符串。 字符串.max_substrings
— 可选的Int64
,默认值为 0。当max_substrings
> 0 时,返回的子字符串将不超过max_substrings
个,否则函数将返回尽可能多的子字符串。
返回值
设置 splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings
> 0 时,是否将剩余字符串包含在结果数组的最后一个元素中。
示例
SELECT splitByWhitespace(' 1! a, b. ');
结果
┌─splitByWhitespace(' 1! a, b. ')─┐
│ ['1!','a,','b.'] │
└─────────────────────────────────────┘
splitByNonAlpha
将字符串分割成以空格和标点符号分隔的子字符串。返回选定的子字符串数组。
语法
splitByNonAlpha(s[, max_substrings]))
参数
s
— 要分割的字符串。 字符串.max_substrings
— 可选的Int64
,默认值为 0。当max_substrings
> 0 时,返回的子字符串将不超过max_substrings
个,否则函数将返回尽可能多的子字符串。
返回值
设置 splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings
> 0 时,是否将剩余字符串包含在结果数组的最后一个元素中。
示例
SELECT splitByNonAlpha(' 1! a, b. ');
┌─splitByNonAlpha(' 1! a, b. ')─┐
│ ['1','a','b'] │
└───────────────────────────────────┘
arrayStringConcat
使用分隔符连接数组中列出的值的字符串表示。separator
是一个可选参数:一个常量字符串,默认设置为一个空字符串。返回字符串。
语法
arrayStringConcat(arr\[, separator\])
示例
SELECT arrayStringConcat(['12/05/2021', '12:50:00'], ' ') AS DateString;
结果
┌─DateString──────────┐
│ 12/05/2021 12:50:00 │
└─────────────────────┘
alphaTokens
从 a-z 和 A-Z 范围内选择连续字节的子字符串。返回子字符串数组。
语法
alphaTokens(s[, max_substrings]))
别名:splitByAlpha
参数
s
— 要分割的字符串。 字符串.max_substrings
— 可选的Int64
,默认值为 0。当max_substrings
> 0 时,返回的子字符串将不超过max_substrings
个,否则函数将返回尽可能多的子字符串。
返回值
设置 splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings
> 0 时,是否将剩余字符串包含在结果数组的最后一个元素中。
示例
SELECT alphaTokens('abca1abc');
┌─alphaTokens('abca1abc')─┐
│ ['abca','abc'] │
└─────────────────────────┘
extractAllGroups
从正则表达式匹配的非重叠子字符串中提取所有组。
语法
extractAllGroups(text, regexp)
参数
返回值
- 如果函数找到至少一个匹配组,它将返回
Array(Array(String))
列,按组 ID(1 到 N,其中 N 是regexp
中捕获组的数量)进行聚类。如果没有匹配组,它将返回一个空数组。 数组.
示例
SELECT extractAllGroups('abc=123, 8="hkl"', '("[^"]+"|\\w+)=("[^"]+"|\\w+)');
结果
┌─extractAllGroups('abc=123, 8="hkl"', '("[^"]+"|\\w+)=("[^"]+"|\\w+)')─┐
│ [['abc','123'],['8','"hkl"']] │
└───────────────────────────────────────────────────────────────────────┘
ngrams
将 UTF-8 字符串分割成 ngramsize
个符号的 n-gram。
语法
ngrams(string, ngramsize)
参数
返回值
示例
SELECT ngrams('ClickHouse', 3);
结果
┌─ngrams('ClickHouse', 3)───────────────────────────┐
│ ['Cli','lic','ick','ckH','kHo','Hou','ous','use'] │
└───────────────────────────────────────────────────┘
tokens
使用非字母数字 ASCII 字符作为分隔符将字符串分割成标记。
参数
input_string
— 任何以 字符串 数据类型对象表示的字节集。
返回值
- 输入字符串中得到的标记数组。 数组.
示例
SELECT tokens('test1,;\\ test2,;\\ test3,;\\ test4') AS tokens;
结果
┌─tokens────────────────────────────┐
│ ['test1','test2','test3','test4'] │
└───────────────────────────────────┘