STRTOK_SPLIT_TO_TABLE

STRTOK_SPLIT_TO_TABLE

주어진 구분자 집합으로 문자열을 토큰화하고 결과를 행으로 펼쳐요.

참고 항목:

  • STRTOK, STRTOK_TO_ARRAY

출처: Snowflake SQL Reference - STRTOK_SPLIT_TO_TABLE

본문

구문

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

인자

필수:

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

더 알아보기