类别:

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

STRTOK_SPLIT_TO_TABLE

使用给定的一组分隔符将字符串标记化,然后将结果展平为行。

另请参阅:

STRTOKSTRTOK_TO_ARRAY

语法

STRTOK_SPLIT_TO_TABLE(<string> [,<delimiter_list>])
Copy

实参

必填:

string

要标记化的文本。

可选:

delimiter_list

可选的分隔符集。默认值为单个空格字符。

输出

该函数返回以下列:

列名称

数据类型

描述

SEQ

NUMBER

与输入记录相关的唯一序列号。不能保证序列没有间隙或以任何特定方式排序。

INDEX

NUMBER

基于 1 的元素索引。

VALUE

VARCHAR

扁平化数组的元素值。

备注

此查询还可以访问用作此函数数据源的原始(相关)表中的列。如果原始表中的一行导致展平视图中有多行,则复制该输入行中的值以匹配此函数生成的行数。

示例

以下是关于常量输入的简单示例。

SELECT table1.value
  FROM TABLE(STRTOK_SPLIT_TO_TABLE('a.b', '.')) AS table1
  ORDER BY table1.value;
Copy
+-------+
| VALUE |
|-------|
| a     |
| b     |
+-------+

创建表并插入数据:

CREATE OR REPLACE TABLE splittable_strtok (v VARCHAR);
INSERT INTO splittable_strtok (v) VALUES ('a b'), ('cde'), ('f|g'), ('');
SELECT * FROM splittable_strtok;
Copy
+-----+
| V   |
|-----|
| a b |
| cde |
| f|g |
|     |
+-----+

您可以将 LATERAL 关键字与 STRTOK_SPLIT_TO_TABLE 函数一起使用,这样该函数就可以作为关联表在 splittable_strtok 表的每一行上执行:

SELECT *
  FROM splittable_strtok, LATERAL STRTOK_SPLIT_TO_TABLE(splittable_strtok.v, ' ')
  ORDER BY SEQ, INDEX;
Copy
+-----+-----+-------+-------+
| V   | SEQ | INDEX | VALUE |
|-----+-----+-------+-------|
| a b |   1 |     1 | a     |
| a b |   1 |     2 | b     |
| cde |   2 |     1 | cde   |
| f|g |   3 |     1 | f|g   |
+-----+-----+-------+-------+

此示例与前面的示例大致相同,不同之处在于指定了多个分隔符:

SELECT *
  FROM splittable_strtok, LATERAL STRTOK_SPLIT_TO_TABLE(splittable_strtok.v, ' |')
  ORDER BY SEQ, INDEX;
Copy
+-----+-----+-------+-------+
| V   | SEQ | INDEX | VALUE |
|-----+-----+-------+-------|
| a b |   1 |     1 | a     |
| a b |   1 |     2 | b     |
| cde |   2 |     1 | cde   |
| f|g |   3 |     1 | f     |
| f|g |   3 |     2 | g     |
+-----+-----+-------+-------+

创建另一个表,在其中一列包含作者,在另一列包含他们的一些书名。在表格数据中,书名可能用逗号或分号分隔:

CREATE OR REPLACE TABLE authors_books_test2 (author VARCHAR, titles VARCHAR);
INSERT INTO authors_books_test2 (author, titles) VALUES
  ('Nathaniel Hawthorne', 'The Scarlet Letter ; The House of the Seven Gables;The Blithedale Romance'),
  ('Herman Melville', 'Moby Dick,The Confidence-Man');
SELECT * FROM authors_books_test2;
Copy
+---------------------+---------------------------------------------------------------------------+
| AUTHOR              | TITLES                                                                    |
|---------------------+---------------------------------------------------------------------------|
| Nathaniel Hawthorne | The Scarlet Letter ; The House of the Seven Gables;The Blithedale Romance |
| Herman Melville     | Moby Dick,The Confidence-Man                                              |
+---------------------+---------------------------------------------------------------------------+

结合使用 LATERAL 关键字和 SPLIT_TO_TABLE 函数来运行查询,该查询将为每个标题返回单独的行。此外,还可以使用 TRIM 函数来移除标题中的前导空格和尾随空格。请注意,SELECT 列表包括该函数返回的固定 value 列:

SELECT author, TRIM(value) AS title
  FROM authors_books_test2, LATERAL STRTOK_SPLIT_TO_TABLE(titles, ',;')
  ORDER BY author;
Copy
+---------------------+-------------------------------+
| AUTHOR              | TITLE                         |
|---------------------+-------------------------------|
| Herman Melville     | Moby Dick                     |
| Herman Melville     | The Confidence-Man            |
| Nathaniel Hawthorne | The Scarlet Letter            |
| Nathaniel Hawthorne | The House of the Seven Gables |
| Nathaniel Hawthorne | The Blithedale Romance        |
+---------------------+-------------------------------+
语言: 中文