类别:

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

SPLIT

使用给定的分隔符拆分给定的字符串,并在字符串数组中返回结果。

源字符串中的连续拆分字符串,或源字符串的开头或结尾存在拆分字符串,会导致输出中出现空字符串。空分隔符字符串将生成仅包含源字符串的数组。如果任一参数为 NULL,则返回 NULL。

您可以在结果上使用 对数组 进行操作的函数和结构,例如 FLATTENARRAY_SIZE 以及 按索引位置访问

另请参阅:

SPLIT_PART

语法

SPLIT(<string>, <separator>)
Copy

实参

string

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

separator

用于拆分字符串的文本。

返回

返回值的数据类型是 ARRAY。

排序规则详细信息

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

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

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

输出数组中的值不包括排序规则规范,因此不支持进一步的排序规则操作。

示例

将本地主机 IP 地址 127.0.0.1 拆分为由以下四个部分组成的数组:

SELECT SPLIT('127.0.0.1', '.');
Copy
+-------------------------+
| SPLIT('127.0.0.1', '.') |
|-------------------------|
| [                       |
|   "127",                |
|   "0",                  |
|   "0",                  |
|   "1"                   |
| ]                       |
+-------------------------+

按索引位置访问返回数组中的第一个元素:

SELECT SPLIT('127.0.0.1', '.')[0];
Copy
+----------------------------+
| SPLIT('127.0.0.1', '.')[0] |
|----------------------------|
| "127"                      |
+----------------------------+

拆分包含垂直线作为分隔符的字符串,这将返回包含空字符串的输出:

SELECT SPLIT('|a||', '|');
Copy
+--------------------+
| SPLIT('|A||', '|') |
|--------------------|
| [                  |
|   "",              |
|   "a",             |
|   "",              |
|   ""               |
| ]                  |
+--------------------+

使用 SPLIT 的结果,通过 LATERAL FLATTEN 结构从单个字符串生成多条记录。FLATTEN 是一个表函数,接受 VARIANT、OBJECT 或 ARRAY 列,并生成一个横向视图(即包含引用其在 FROM 子句中前置其他表的关联关系的行内视图)。

CREATE TABLE split_test_names(first_name VARCHAR, children VARCHAR);

INSERT INTO split_test_names values
  ('Mark', 'Marky,Mike,Maria'),
  ('John', 'Johnny,Jane');

SELECT * FROM split_test_names;
Copy
+------------+------------------+
| FIRST_NAME | CHILDREN         |
|------------+------------------|
| Mark       | Marky,Mike,Maria |
| John       | Johnny,Jane      |
+------------+------------------+
SELECT first_name, C.value::STRING AS childname
  FROM split_test_names,
    LATERAL FLATTEN(INPUT=>SPLIT(children, ',')) C;
Copy
+------------+-----------+
| FIRST_NAME | CHILDNAME |
|------------+-----------|
| Mark       | Marky     |
| Mark       | Mike      |
| Mark       | Maria     |
| John       | Johnny    |
| John       | Jane      |
+------------+-----------+