본문으로 건너뛰기
최종 수정: 에

SUBSTRING_INDEX

설명​

SUBSTRING_INDEX 함수는 지정된 구분자를 기준으로 문자열의 일부를 추출하는 데 사용됩니다. 구분자가 나타나는 횟수를 지정하여 왼쪽 또는 오른쪽에서 추출할 수 있습니다.

구문​

SUBSTRING_INDEX(<content>, <delimiter>, <field>)

매개변수​

매개변수설명
<content>추출할 원본 문자열입니다. 타입: VARCHAR
<delimiter>대소문자를 구분하며 멀티바이트 문자를 지원하는 구분자 문자열입니다. 타입: VARCHAR
<field>구분자가 나타나는 횟수입니다. 양수이면 왼쪽부터, 음수이면 오른쪽부터 계산하며, 0이면 빈 문자열을 반환합니다. 타입: INT

반환 값​

추출된 부분 문자열을 나타내는 VARCHAR 타입의 값을 반환합니다.

추출 규칙:

  • field > 0인 경우: 왼쪽에서 field번째 구분자 앞의 content를 반환합니다
  • field < 0인 경우: 오른쪽에서 |field|번째 구분자 뒤의 content를 반환합니다
  • field = 0인 경우: 빈 문자열을 반환합니다(content가 NULL이면 NULL을 반환합니다)
  • 구분자는 대소문자를 구분하여 정확히 일치하는지 확인합니다

특수한 경우:

  • 매개변수 중 하나라도 NULL이면 NULL을 반환합니다
  • 문자열에 구분자가 없으면 원본 문자열을 반환합니다
  • 지정한 횟수가 실제 구분자 출현 횟수를 초과하면 추출 가능한 최대 부분을 반환합니다
  • 구분자가 빈 문자열이면 빈 문자열을 반환합니다
  • 원본 문자열이 비어 있으면 빈 문자열을 반환합니다

예제​

  1. 기본적인 왼쪽 추출
SELECT SUBSTRING_INDEX('hello world', ' ', 1), SUBSTRING_INDEX('one,two,three', ',', 2);
+----------------------------------------+------------------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 1) | SUBSTRING_INDEX('one,two,three', ',', 2) |
+----------------------------------------+------------------------------------------+
| hello | one,two |
+----------------------------------------+------------------------------------------+
  1. 오른쪽 추출(음수 횟수)
SELECT SUBSTRING_INDEX('hello world', ' ', -1), SUBSTRING_INDEX('one,two,three', ',', -1);
+-----------------------------------------+-------------------------------------------+
| SUBSTRING_INDEX('hello world', ' ', -1) | SUBSTRING_INDEX('one,two,three', ',', -1) |
+-----------------------------------------+-------------------------------------------+
| world | three |
+-----------------------------------------+-------------------------------------------+
  1. NULL 값 처리
SELECT SUBSTRING_INDEX(NULL, ',', 1), SUBSTRING_INDEX('test', NULL, 1);
+--------------------------------+------------------------------------+
| SUBSTRING_INDEX(NULL, ',', 1) | SUBSTRING_INDEX('test', NULL, 1) |
+--------------------------------+------------------------------------+
| NULL | NULL |
+--------------------------------+------------------------------------+
  1. 횟수가 영인 경우 처리
SELECT SUBSTRING_INDEX('hello world', ' ', 0), SUBSTRING_INDEX('a,b,c', ',', 0);
+----------------------------------------+----------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 0) | SUBSTRING_INDEX('a,b,c', ',', 0) |
+----------------------------------------+----------------------------------+
| | |
+----------------------------------------+----------------------------------+
  1. 구분자가 없는 경우
SELECT SUBSTRING_INDEX('hello world', ',', 1), SUBSTRING_INDEX('no-delimiter', '|', -1);
+----------------------------------------+------------------------------------------+
| SUBSTRING_INDEX('hello world', ',', 1) | SUBSTRING_INDEX('no-delimiter', '|', -1) |
+----------------------------------------+------------------------------------------+
| hello world | no-delimiter |
+----------------------------------------+------------------------------------------+
  1. 지정한 횟수가 구분자 출현 횟수를 초과하는 경우
SELECT SUBSTRING_INDEX('a,b,c', ',', 5), SUBSTRING_INDEX('a,b,c', ',', -5);
+----------------------------------+-----------------------------------+
| SUBSTRING_INDEX('a,b,c', ',', 5) | SUBSTRING_INDEX('a,b,c', ',', -5) |
+----------------------------------+-----------------------------------+
| a,b,c | a,b,c |
+----------------------------------+-----------------------------------+
  1. UTF-8 멀티바이트 문자 구분자
SELECT SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1), SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1);
+-----------------------------------------------+------------------------------------------------+
| SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1) | SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1) |
+-----------------------------------------------+------------------------------------------------+
| ṭṛì | hello |
+-----------------------------------------------+------------------------------------------------+
  1. 여러 문자로 구성된 구분자
SELECT SUBSTRING_INDEX('data::field::value', '::', 2), SUBSTRING_INDEX('data::field::value', '::', -1);
+---------------------------------------------+----------------------------------------------+
| SUBSTRING_INDEX('data::field::value', '::', 2) | SUBSTRING_INDEX('data::field::value', '::', -1) |
+---------------------------------------------+----------------------------------------------+
| data::field | value |
+---------------------------------------------+----------------------------------------------+
  1. 원본 문자열이 빈 경우
SELECT SUBSTRING_INDEX('', ' ', 1);
+-----------------------------+
| SUBSTRING_INDEX('', ' ', 1) |
+-----------------------------+
| |
+-----------------------------+

키워드​

SUBSTRING_INDEX, SUBSTRING