SPLIT_PART

SPLIT_PART

주어진 문자열을 지정된 문자에서 분할하고 요청된 부분을 반환해요.

지정된 문자 이후의 모든 문자를 반환하려면 POSITION 및 SUBSTR 함수를 사용할 수 있어요. 예제는 이메일, 전화, 날짜 문자열의 하위 문자열 반환(Returning substrings for email, phone, and date strings) 문서를 참고해요.

출처: Snowflake SPLIT_PART 함수 문서

본문

팁: 검색 최적화 서비스(Search Optimization Service)를 사용하면 이 함수를 호출하는 쿼리의 성능을 개선할 수 있어요. 자세한 내용은 검색 최적화 서비스 문서를 참고해요.

참고 항목: SPLIT, STRTOK

구문 (Syntax)

SPLIT_PART(, , 
)

인자 (Arguments)

  • string — 부분으로 분할할 텍스트예요.
  • delimiter — 분할 기준이 되는 구분자를 나타내는 텍스트예요. 구분자 문자열 전체는, 여러 문자를 포함하더라도 단일 구분자로 취급돼요. 이 동작은 구분자의 각 문자를 개별 구분자로 취급하는 STRTOK와 다르다.
  • partNumber — 분할의 요청된 부분으로, 1부터 시작해서 첫 번째 토큰이 토큰 번호 1이지 토큰 번호 0이 아니에요. 값이 음수이면 문자열의 끝에서부터 역방향으로 부분을 센다.

반환 값 (Returns)

이 함수는 VARCHAR 타입의 값을 반환해요.

어떤 인자가 NULL이면 함수는 NULL을 반환해요.

사용 노트 (Usage Notes)

  • partNumber가 범위를 벗어나면 반환 값은 빈 문자열이에요.
  • 문자열이 구분자로 시작하거나 끝나면, 시스템은 각각 구분자 앞 또는 뒤의 빈 공간을 분할 결과의 유효한 부분으로 간주해요. 예제는 아래 예제 섹션 참고. 이는 SPLIT_PART가 빈 문자열을 부분으로 반환할 수 있음을 의미하며, 빈 문자열을 절대 반환하지 않는 STRTOK와 달라요.
  • partNumber가 0이면 1로 취급돼요. 즉 분할의 첫 번째 요소를 가져와요. 인덱스가 1 기반인지 0 기반인지에 대한 혼동을 피하기 위해, Snowflake는 1의 동의어로 0을 사용하지 않는 것을 권장해요.
  • 구분자가 빈 문자열이면, 분할 후 반환 값은 입력 문자열이에요 (문자열이 분할되지 않음).

정렬 규칙 세부사항 (Collation Details)

모든 입력 인자의 정렬 규칙 지정은 서로 호환돼야 해요.

이 함수는 다음 정렬 규칙 지정을 지원하지 않아요:

  • pi (구두점 무시)
  • cs-ai (대소문자 구분, 악센트 무시)

예제 (Examples)

다음 예제들은 SPLIT_PART 함수를 호출해요:

  • 서로 다른 부분 번호 값에 대해 반환되는 부분을 보여줌
  • IP 주소의 첫 부분과 마지막 부분을 반환
  • 구분자가 첫 번째 문자인 경우를 보여줌
  • 다중 문자 구분자를 보여줌
  • 구분자가 빈 문자열인 경우를 보여줌
  • STRTOK와 SPLIT_PART의 차이점을 보여줌

서로 다른 부분 번호 값에 대해 반환되는 부분

다음 예제는 서로 다른 partNumber 값이 반환하는 부분을 보여줘요:

SELECT column1 part_number_value, column2 portion
  FROM VALUES
    (0, SPLIT_PART('11.22.33', '.',  0)),
    (1, SPLIT_PART('11.22.33', '.',  1)),
    (2, SPLIT_PART('11.22.33', '.',  2)),
    (3, SPLIT_PART('11.22.33', '.',  3)),
    (4, SPLIT_PART('11.22.33', '.',  4)),
    (-1, SPLIT_PART('11.22.33', '.',  -1)),
    (-2, SPLIT_PART('11.22.33', '.',  -2)),
    (-3, SPLIT_PART('11.22.33', '.',  -3)),
    (-4, SPLIT_PART('11.22.33', '.',  -4));
+-------------------+---------+
| PART_NUMBER_VALUE | PORTION |
|-------------------+---------|
|                 0 | 11      |
|                 1 | 11      |
|                 2 | 22      |
|                 3 | 33      |
|                 4 |         |
|                -1 | 33      |
|                -2 | 22      |
|                -3 | 11      |
|                -4 |         |
+-------------------+---------+

IP 주소의 첫 부분과 마지막 부분 반환

다음 예제는 localhost IP 주소 127.0.0.1의 첫 부분과 마지막 부분을 반환해요:

SELECT SPLIT_PART('127.0.0.1', '.', 1) AS first_part,
       SPLIT_PART('127.0.0.1', '.', -1) AS last_part;
+------------+-----------+
| FIRST_PART | LAST_PART |
|------------+-----------|
| 127        | 1         |
+------------+-----------+

구분자가 첫 번째 문자인 경우

다음 예제는 세로 막대로 구분된 문자 문자열의 첫 부분과 두 번째 부분을 반환해요. 구분자가 입력 문자열의 첫 부분이므로, 분할 후 첫 번째 요소는 빈 문자열이에요.

SELECT SPLIT_PART('%a%b%c%', '|', 1) AS first_part,
       SPLIT_PART('%a%b%c%', '|', 2) AS last_part;
+------------+-----------+
| FIRST_PART | LAST_PART |
|------------+-----------|
|            | a         |
+------------+-----------+

다중 문자 구분자

다음 예제는 다중 문자 구분자를 보여줘요:

SELECT SPLIT_PART('aaa--bbb-BBB--ccc', '--', 2) AS multi_character_delimiter;
+---------------------------+
| MULTI_CHARACTER_DELIMITER |
|---------------------------|
| bbb-BBB                   |
+---------------------------+

구분자가 빈 문자열인 경우

다음 예제는 구분자가 빈 문자열이면 분할 후에도 여전히 문자열이 하나뿐임을 보여줘요:

SELECT column1 part_number_value, column2 portion
  FROM VALUES
    (1, SPLIT_PART('[email protected]', '',  1)),
    (-1, SPLIT_PART('[email protected]', '', -1)),
    (2, SPLIT_PART('[email protected]', '',  2)),
    (-2, SPLIT_PART('[email protected]', '', -2));
+-------------------+--------------------+
| PART_NUMBER_VALUE | PORTION            |
|-------------------+--------------------|
|                 1 | [email protected] |
|                -1 | [email protected] |
|                 2 |                    |
|                -2 |                    |
+-------------------+--------------------+

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

더 알아보기