カテゴリ:

文字列とバイナリ関数 (一般)、 テーブル関数

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

STRTOK_SPLIT_TO_TABLE 関数で LATERAL キーワードを使用すると、関数は 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     |
+-----+-----+-------+-------+

1つの列に著者、もう1つの列に書籍のタイトルを含む別のテーブルを作成します。テーブルデータでは、本のタイトルはコンマやセミコロンで区切られることがあります。

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