字符串搜索函数
本节中的所有函数默认进行区分大小写的搜索。通常会提供单独的函数变体以支持不区分大小写的搜索。
注意事项
-
不区分大小写的搜索遵循英语的大小写规则。例如,英语中大写的
i
是I
,而在土耳其语中是İ
,因此对于非英语语言,结果可能不符合预期。 -
本节中的函数假设被搜索的字符串(称为
haystack
)和搜索的子字符串(称为needle
)是单字节编码的文本。如果违反此假设,不会抛出异常,结果也是未定义的。对于 UTF-8 编码字符串的搜索,通常会提供单独的函数变体。同样,如果使用 UTF-8 函数变体而输入字符串不是 UTF-8 编码文本,也不会抛出异常,结果同样是未定义的。 -
注意,不会自动进行 Unicode 标准化,但你可以使用
normalizeUTF8*()
函数来实现。
1. position
返回子字符串 needle
在字符串 haystack
中的位置(以字节为单位,从 1 开始)。
语法:
position(haystack, needle[, start_pos])
别名:
-
position(needle IN haystack)
参数:
-
haystack
:被搜索的字符串。类型为字符串或枚举。 -
needle
:要搜索的子字符串。类型为字符串。 -
start_pos
:在haystack
中开始搜索的位置(从 1 开始)。类型为无符号整数。可选参数。
返回值:
-
如果找到子字符串,则返回其在
haystack
中的起始位置(以字节为单位,从 1 开始)。类型为UInt64
。 -
如果未找到子字符串,则返回
0
。
如果子字符串 needle
为空,则适用以下规则:
-
如果未指定
start_pos
,则返回1
。 -
如果
start_pos = 0
,则返回1
。 -
如果
start_pos >= 1
且start_pos <= length(haystack) + 1
,则返回start_pos
。 -
否则返回
0
。
这些规则同样适用于 locate
、positionCaseInsensitive
、positionUTF8
和 positionCaseInsensitiveUTF8
函数。
2. locate
与 position
类似,但参数顺序相反(haystack
和 needle
互换)。
从 ClickHouse v24.3 开始,locate
成为一个独立函数(以更好地兼容 MySQL),接受参数 (needle, haystack[, start_pos])
。如果需要恢复旧版本的行为,可以通过设置 function_locate_has_mysql_compatible_argument_order = false
来实现。
语法:
locate(needle, haystack[, start_pos])
3. positionCaseInsensitive
position
的不区分大小写版本。
示例:
SELECT positionCaseInsensitive('Hello, world!', 'hello');
结果:
1
4. positionUTF8
与 position
类似,但假设 haystack