STRTOK

STRTOK

주어진 문자열을 토큰화하고 요청한 부분을 돌려주는 함수예요. Linux의 strtok()처럼 빈 문자열을 토큰으로 반환하지 않는 점이 특징이에요.

출처: 공식 문서

본문

주어진 문자열을 토큰화하고 요청한 부분을 반환합니다.

참고 (See also): SPLIT_PART

구문 (Syntax)

STRTOK(<string> [,<delimiter>] [,<partNumber>])

인자 (Arguments)

필수 (Required):

string

토큰화할 텍스트입니다.

선택 (Optional):

delimiter

토큰화할 구분자 집합을 나타내는 텍스트입니다. 구분자 문자열의 각 문자는 별개의 구분자입니다. 예를 들어 구분자가 '@.'이면 @와 . 둘 다 구분자로 취급됩니다. 이 동작은 전체 구분자를 단일 구분자 문자열로 취급하는 SPLIT_PART와 다릅니다.

  • 구분자가 비어 있고 문자열도 비어 있으면 함수는 NULL을 반환합니다.
  • 구분자가 비어 있고 문자열이 비어 있지 않으면 전체 문자열이 하나의 토큰으로 취급됩니다.

기본값: 공백 문자 하나

partNumber

요청한 토큰으로, 1부터 시작합니다(첫 번째 토큰이 토큰 0이 아니라 토큰 1). 토큰 번호가 범위를 벗어나면 NULL이 반환됩니다. 기본값: 1

반환값 (Returns)

반환값의 데이터 타입은 VARCHAR입니다.

요청한 부분이 존재하지 않거나 어떤 인자든 NULL이면 NULL이 반환됩니다.

사용 참고 (Usage notes)

Linux strtok()과 비슷하게, STRTOK는 빈 문자열을 토큰으로 결코 반환하지 않습니다. 이 동작은 입력 문자열이 구분자로 시작·끝나거나 구분자가 연속될 때 빈 문자열을 부분으로 반환할 수 있는 SPLIT_PART와 다릅니다.

예제 (Examples)

다음 예제들은 STRTOK 함수를 호출합니다.

문자열에서 첫 번째 토큰 반환하기

다음 간단한 예제는 문자열의 첫 번째 토큰을 반환하기 위해 STRTOK를 호출합니다:

SELECT STRTOK('a.b.c', '.', 1);
+-------------------------+
| STRTOK('A.B.C', '.', 1) |
|-------------------------|
| a                       |
+-------------------------+

여러 구분자를 사용해 다른 토큰 반환하기

다음 예제는 구분자가 @와 .일 때 첫 번째, 두 번째, 세 번째 토큰을 반환하기 위해 여러 구분자를 사용하는 방법을 보여줍니다:

SELECT STRTOK('[email protected]', '@.', 1);
+---------------------------------------+
| STRTOK('[email protected]', '@.', 1) |
|---------------------------------------|
| user                                  |
+---------------------------------------+
SELECT STRTOK('[email protected]', '@.', 2);
+---------------------------------------+
| STRTOK('[email protected]', '@.', 2) |
|---------------------------------------|
| snowflake                             |
+---------------------------------------+
SELECT STRTOK('[email protected]', '@.', 3);
+---------------------------------------+
| STRTOK('[email protected]', '@.', 3) |
|---------------------------------------|
| com                                   |
+---------------------------------------+

문자열의 마지막 가능한 토큰을 넘어 인덱싱하기

다음 예제는 문자열의 마지막 가능한 토큰을 넘어 인덱싱할 때 어떤 일이 발생하는지 보여줍니다:

SELECT STRTOK('[email protected].', '@.', 4);
+----------------------------------------+
| STRTOK('[email protected].', '@.', 4) |
|----------------------------------------|
| NULL                                   |
+----------------------------------------+

첫 번째 요소가 문자열 끝을 넘어갈 수 있는 방법 보여주기

이 예제에서 입력 문자열은 비어 있고 요소도 없습니다. 따라서 첫 번째 요소가 문자열의 끝을 넘어가므로, 함수는 빈 문자열 대신 NULL을 반환합니다:

SELECT STRTOK('', '', 1);
+-------------------+
| STRTOK('', '', 1) |
|-------------------|
| NULL              |
+-------------------+

빈 구분자로 STRTOK 호출하기

빈 구분자 문자열을 사용한 예제입니다:

SELECT STRTOK('a.b', '', 1);
+----------------------+
| STRTOK('A.B', '', 1) |
|----------------------|
| a.b                  |
+----------------------+

인자에 대한 NULL 값 보여주기

다음 예제들은 각 인자에 대해 NULL 값을 지정합니다:

SELECT STRTOK(NULL, '.', 1);
+----------------------+
| STRTOK(NULL, '.', 1) |
|----------------------|
| NULL                 |
+----------------------+
SELECT STRTOK('a.b', NULL, 1);
+------------------------+
| STRTOK('A.B', NULL, 1) |
|------------------------|
| NULL                   |
+------------------------+
SELECT STRTOK('a.b', '.', NULL);
+--------------------------+
| STRTOK('A.B', '.', NULL) |
|--------------------------|
| NULL                     |
+--------------------------+

STRTOK와 SPLIT_PART의 차이 보여주기

이 예제는 반복 구분자를 사용할 때 STRTOK와 SPLIT_PART의 차이를 보여줍니다. STRTOK는 구분자 문자열 '|-'의 각 문자를 별개의 구분자로 취급해 모든 '|'와 '-' 문자에서 분리합니다. 반면 SPLIT_PART는 전체 구분자 문자열 '|-'를 단일 구분자로 취급하므로, 해당 정확한 시퀀스가 나타나는 곳에서만 분리합니다:

SELECT STRTOK('data1|%data2%-data3---data4', '|-', 1) AS strtok_1,
       STRTOK('data1|%data2%-data3---data4', '|-', 2) AS strtok_2,
       STRTOK('data1|%data2%-data3---data4', '|-', 3) AS strtok_3,
       STRTOK('data1|%data2%-data3---data4', '|-', 4) AS strtok_4,
       SPLIT_PART('data1|%data2%-data3---data4', '|-', 1) AS split_part_1,
       SPLIT_PART('data1|%data2%-data3---data4', '|-', 2) AS split_part_2,
       SPLIT_PART('data1|%data2%-data3---data4', '|-', 3) AS split_part_3;
+----------+----------+----------+----------+-----------------+--------------+--------------+
| STRTOK_1 | STRTOK_2 | STRTOK_3 | STRTOK_4 | SPLIT_PART_1    | SPLIT_PART_2 | SPLIT_PART_3 |
|----------+----------+----------+----------+-----------------+--------------+--------------|
| data1    | data2    | data3    | data4    | data1||data2    | data3---data4|              |
+----------+----------+----------+----------+-----------------+--------------+--------------+

더 알아보기 (Learn more)