类别:

:doc:`/sql-reference/functions-string`(通用)

SPLIT_PART

在指定字符处拆分给定的字符串,并返回请求的部分。

要返回指定字符之后的所有字符,可以使用 POSITIONSUBSTR 函数。有关示例,请参阅 返回电子邮件地址、电话和日期字符串的子字符串

小技巧

您可以使用搜索优化服务,提高用于调用此函数的查询的性能。有关详细信息,请参阅 搜索优化服务

另请参阅:

SPLIT, STRTOK

语法

SPLIT_PART(<string>, <delimiter>, <partNumber>)

实参

string

要拆分为多个部分的文本。

delimiter

表示要拆分的分隔符的文本。整个分隔符字符串被视为单个分隔符,即使它包含多个字符也是如此。此行为不同于 STRTOK,后者将分隔符中的每个字符视为单独的分隔符。

partNumber

请求的拆分部分,从 1 开始,因此第一个词元是词元编号 1,而不是词元编号 0。

如果该值为负数,则从字符串末尾向后计数。

返回

此函数返回 VARCHAR 类型的值。

如果任何实参为 NULL,则该函数返回 NULL。

使用说明

  • 如果 partNumber 超出范围,则返回的值为空字符串。

  • 如果字符串以分隔符开始或终止,则系统将分隔符之前或之后的空格分别视为拆分结果的有效部分。有关示例,请参阅下面的 示例 部分。这意味着 SPLIT_PART 可以将空字符串作为部分返回,这与从不返回空字符串的 STRTOK 不同。

  • 如果 partNumber 为 0,则将其视为 1。换句话说,它获取拆分的第一个元素。为了避免混淆索引是从 1 开始还是从 0 开始,Snowflake 建议避免使用 0 作为 1 的同义词。

  • 如果分隔符是空字符串,则拆分后,返回的值是输入字符串(字符串未拆分)。

排序规则详细信息

The collation specifications of all input arguments must be compatible.

此函数不支持以下排序规则规范:

  • :code:`pi`(不区分标点符号)。

  • :code:`cs-ai`(区分大小写,不区分重音)。

示例

以下示例调用 SPLIT_PART 函数:

演示针对不同部件编号值返回的部分

此示例显示了不同 partNumber 值返回的部分。

SELECT column1 part_number_value, column2 portion
  FROM VALUES
    (0, SPLIT_PART('11.22.33', '.',  0)),
    (1, SPLIT_PART('11.22.33', '.',  1)),
    (2, SPLIT_PART('11.22.33', '.',  2)),
    (3, SPLIT_PART('11.22.33', '.',  3)),
    (4, SPLIT_PART('11.22.33', '.',  4)),
    (-1, SPLIT_PART('11.22.33', '.',  -1)),
    (-2, SPLIT_PART('11.22.33', '.',  -2)),
    (-3, SPLIT_PART('11.22.33', '.',  -3)),
    (-4, SPLIT_PART('11.22.33', '.',  -4));
+-------------------+---------+
| PART_NUMBER_VALUE | PORTION |
|-------------------+---------|
|                 0 | 11      |
|                 1 | 11      |
|                 2 | 22      |
|                 3 | 33      |
|                 4 |         |
|                -1 | 33      |
|                -2 | 22      |
|                -3 | 11      |
|                -4 |         |
+-------------------+---------+

返回 IP 地址的第一部分和最后一部分

以下示例返回本地主机 IP 地址 127.0.0.1 的第一部分和最后一部分:

SELECT SPLIT_PART('127.0.0.1', '.', 1) AS first_part,
       SPLIT_PART('127.0.0.1', '.', -1) AS last_part;
+------------+-----------+
| FIRST_PART | LAST_PART |
|------------+-----------|
| 127        | 1         |
+------------+-----------+

演示分隔符作为第一个字符

以下示例返回由竖线分隔的字符串的第一部分和第二部分。分隔符是输入字符串的第一部分,因此拆分后的第一个元素是空字符串。

SELECT SPLIT_PART('|a|b|c|', '|', 1) AS first_part,
       SPLIT_PART('|a|b|c|', '|', 2) AS last_part;
+------------+-----------+
| FIRST_PART | LAST_PART |
|------------+-----------|
|            | a         |
+------------+-----------+

演示多字符分隔符

以下示例显示了一个多字符分隔符:

SELECT SPLIT_PART('aaa--bbb-BBB--ccc', '--', 2) AS multi_character_delimiter;
+---------------------------+
| MULTI_CHARACTER_DELIMITER |
|---------------------------|
| bbb-BBB                   |
+---------------------------+

演示分隔符为空字符串

以下示例显示,如果分隔符为空字符串,则拆分后仍然只有一个字符串:

SELECT column1 part_number_value, column2 portion
  FROM VALUES
    (1, SPLIT_PART('user@snowflake.com', '',  1)),
    (-1, SPLIT_PART('user@snowflake.com', '', -1)),
    (2, SPLIT_PART('user@snowflake.com', '',  2)),
    (-2, SPLIT_PART('user@snowflake.com', '', -2));
+-------------------+--------------------+
| PART_NUMBER_VALUE | PORTION            |
|-------------------+--------------------|
|                 1 | user@snowflake.com |
|                -1 | user@snowflake.com |
|                 2 |                    |
|                -2 |                    |
+-------------------+--------------------+

展示 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|              |
+----------+----------+----------+----------+-----------------+--------------+--------------+