- 类别:
字符串和二进制函数 (通用)
STRTOK¶
将给定的字符串标记化,然后返回请求的部分。
- 另请参阅:
语法¶
STRTOK(<string> [,<delimiter>] [,<partNumber>])
实参¶
必填:
string要标记化的文本。
可选:
delimiter用于表示要标记化的分隔符集的文本。分隔符字符串中的每个字符都是单独的分隔符。例如,如果分隔符是
'@.',则'@'和'.'两者均被视为分隔符。此行为不同于 SPLIT_PART,后者将整个分隔符视为单个分隔符字符串。如果分隔符为空,并且
string也为空,则函数返回 NULL。如果分隔符为空,并且string为非空,则整个字符串被视为一个令牌。默认值:None。单个空格字符
partNumber请求的词元,从 1 开始(即,第一个词元是词元号 1,而不是词元号 0)。如果令牌号超出范围,则返回 NULL。
默认值:1
返回¶
返回值的数据类型是 VARCHAR。
如果请求的部分不存在或有任何实参为 NULL,则返回 NULL。
使用说明¶
类似于 Linux strtok(),STRTOK 永远不会返回空字符串作为令牌。此行为不同于:doc:split_part,当输入字符串以分隔符开头或结尾,或者存在连续的分隔符时,它可以将空字符串作为部分返回。
示例¶
以下示例调用 STRTOK 函数:
返回字符串中的第一个词元¶
以下简单示例调用 STRTOK 来返回字符串中的第一个词元:
SELECT STRTOK('a.b.c', '.', 1);
+-------------------------+
| STRTOK('A.B.C', '.', 1) |
|-------------------------|
| a |
+-------------------------+
使用多个分隔符返回不同的词元¶
以下示例展示在分隔符为 @ 和 . 时,如何使用多个分隔符返回第一个、第二个和第三个词元。
SELECT STRTOK('user@snowflake.com', '@.', 1);
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 1) |
|---------------------------------------|
| user |
+---------------------------------------+
SELECT STRTOK('user@snowflake.com', '@.', 2);
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 2) |
|---------------------------------------|
| snowflake |
+---------------------------------------+
SELECT STRTOK('user@snowflake.com', '@.', 3);
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 3) |
|---------------------------------------|
| com |
+---------------------------------------+
演示索引超过字符串中最后一个可能的词元¶
以下示例演示,当索引超过字符串中最后一个可能的词元,会发生什么:
SELECT STRTOK('user@snowflake.com.', '@.', 4);
+----------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM.', '@.', 4) |
|----------------------------------------|
| NULL |
+----------------------------------------+
演示第一个元素如何超过字符串的末尾¶
在此示例中,输入字符串为空,并且没有元素。因此,第一个元素超出了字符串的末尾,函数返回 NULL 而不是空字符串:
SELECT STRTOK('', '', 1);
+-------------------+
| STRTOK('', '', 1) |
|-------------------|
| NULL |
+-------------------+
使用空的分隔符调用 STRTOK¶
下面是采用空字符串的示例:
SELECT STRTOK('a.b', '', 1);
+----------------------+
| STRTOK('A.B', '', 1) |
|----------------------|
| a.b |
+----------------------+
展示实参的 NULL 值¶
以下示例指定每个实参的 NULL 值:
SELECT STRTOK(NULL, '.', 1);
+----------------------+
| STRTOK(NULL, '.', 1) |
|----------------------|
| NULL |
+----------------------+
SELECT STRTOK('a.b', NULL, 1);
+------------------------+
| STRTOK('A.B', NULL, 1) |
|------------------------|
| NULL |
+------------------------+
SELECT STRTOK('a.b', '.', NULL);
+--------------------------+
| STRTOK('A.B', '.', NULL) |
|--------------------------|
| NULL |
+--------------------------+
展示 STRTOK 和 SPLIT_PART 之间的差异¶
此示例演示了使用重复的分隔符时 STRTOK 和 SPLIT_PART 的区别。STRTOK 会将分隔符字符串 '|-' 中的每个字符视为单独的分隔符,在每个 '|' 和 '-' 字符处进行拆分。相比之下,SPLIT_PART 将整个分隔符字符串 '|-' 视为单个分隔符,因此它仅在确切序列出现的位置进行拆分:
SELECT STRTOK('data1||data2|-data3---data4', '|-', 1) AS strtok_1,
STRTOK('data1||data2|-data3---data4', '|-', 2) AS strtok_2,
STRTOK('data1||data2|-data3---data4', '|-', 3) AS strtok_3,
STRTOK('data1||data2|-data3---data4', '|-', 4) AS strtok_4,
SPLIT_PART('data1||data2|-data3---data4', '|-', 1) AS split_part_1,
SPLIT_PART('data1||data2|-data3---data4', '|-', 2) AS split_part_2,
SPLIT_PART('data1||data2|-data3---data4', '|-', 3) AS split_part_3;
+----------+----------+----------+----------+-----------------+--------------+--------------+
| STRTOK_1 | STRTOK_2 | STRTOK_3 | STRTOK_4 | SPLIT_PART_1 | SPLIT_PART_2 | SPLIT_PART_3 |
|----------+----------+----------+----------+-----------------+--------------+--------------|
| data1 | data2 | data3 | data4 | data1||data2 | data3---data4| |
+----------+----------+----------+----------+-----------------+--------------+--------------+