카테고리:

문자열 및 이진 함수 (일반) , 테이블 함수

STRTOK_SPLIT_TO_TABLE

주어진 구분 기호 세트로 문자열을 토큰화하고 결과를 행으로 평면화합니다.

참고 항목:

STRTOK, STRTOK_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     |
+-----+-----+-------+-------+

한 열에는 저자를, 다른 열에는 저자의 책 제목 중 몇 가지를 포함하는 또 다른 테이블을 만듭니다. 테이블 데이터에서 책 제목은 쉼표나 세미콜론으로 구분할 수 있습니다.

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