类别:

字符串和二进制函数 (通用)

STRTOK

将给定的字符串标记化,然后返回请求的部分。

另请参阅:

SPLIT_PART

语法

STRTOK(<string> [,<delimiter>] [,<partNumber>])
Copy

实参

必填:

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);
Copy
+-------------------------+
| STRTOK('A.B.C', '.', 1) |
|-------------------------|
| a                       |
+-------------------------+

使用多个分隔符返回不同的词元

以下示例展示在分隔符为 @. 时,如何使用多个分隔符返回第一个、第二个和第三个词元。

SELECT STRTOK('user@snowflake.com', '@.', 1);
Copy
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 1) |
|---------------------------------------|
| user                                  |
+---------------------------------------+
SELECT STRTOK('user@snowflake.com', '@.', 2);
Copy
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 2) |
|---------------------------------------|
| snowflake                             |
+---------------------------------------+
SELECT STRTOK('user@snowflake.com', '@.', 3);
Copy
+---------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM', '@.', 3) |
|---------------------------------------|
| com                                   |
+---------------------------------------+

演示索引超过字符串中最后一个可能的词元

以下示例演示,当索引超过字符串中最后一个可能的词元,会发生什么:

SELECT STRTOK('user@snowflake.com.', '@.', 4);
Copy
+----------------------------------------+
| STRTOK('USER@SNOWFLAKE.COM.', '@.', 4) |
|----------------------------------------|
| NULL                                   |
+----------------------------------------+

演示第一个元素如何超过字符串的末尾

在此示例中,输入字符串为空,并且没有元素。因此,第一个元素超出了字符串的末尾,函数返回 NULL 而不是空字符串:

SELECT STRTOK('', '', 1);
Copy
+-------------------+
| STRTOK('', '', 1) |
|-------------------|
| NULL              |
+-------------------+

使用空的分隔符调用 STRTOK

下面是采用空字符串的示例:

SELECT STRTOK('a.b', '', 1);
Copy
+----------------------+
| STRTOK('A.B', '', 1) |
|----------------------|
| a.b                  |
+----------------------+

展示实参的 NULL 值

以下示例指定每个实参的 NULL 值:

SELECT STRTOK(NULL, '.', 1);
Copy
+----------------------+
| STRTOK(NULL, '.', 1) |
|----------------------|
| NULL                 |
+----------------------+
SELECT STRTOK('a.b', NULL, 1);
Copy
+------------------------+
| STRTOK('A.B', NULL, 1) |
|------------------------|
| NULL                   |
+------------------------+
SELECT STRTOK('a.b', '.', NULL);
Copy
+--------------------------+
| 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;
Copy
+----------+----------+----------+----------+-----------------+--------------+--------------+
| 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|              |
+----------+----------+----------+----------+-----------------+--------------+--------------+