SUBSTRING_INDEX() 함수란?
MySQL에서는 SUBSTRING_INDEX() 함수를 사용하면 특정 구분자를 기준으로 문자열을 손쉽게 분할할 수 있습니다. 이 함수는 SUBSTRING_INDEX(문자열, 구분자, 횟수) 형태로 사용하며, 구분자가 지정한 횟수만큼 나타나기 전까지의 부분 문자열을 반환합니다. 횟수가 양수이면 왼쪽부터, 음수이면 오른쪽부터 계산합니다.
아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1465
-> (
-> Name varchar(40)
-> );
Query OK, 0 rows affected (0.54 sec)
2단계: 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 샘플 데이터를 추가합니다.
mysql> insert into DemoTable1465 values('Chris Brown');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1465 values('David Miller');
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable1465 values('John Doe');
Query OK, 1 row affected (0.14 sec)3단계: 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1465;
실행 결과는 다음과 같습니다.
+--------------+
| Name |
+--------------+
| Chris Brown |
| David Miller |
| John Doe |
+--------------+
3 rows in set (0.00 sec)
4단계: SUBSTRING_INDEX()로 이름 분할하기
다음은 SUBSTRING_INDEX() 함수를 활용하여 전체 이름(Full Name)에서 이름(First Name)과 성(Last Name)을 분리하는 쿼리입니다. 공백(' ')을 구분자로 사용하여 첫 번째 단어와 마지막 단어를 각각 추출합니다.
mysql> select
-> substring_index(substring_index(Name, ' ', 1), ' ', -1) as StudentFirstName,
-> substring_index(substring_index(Name, ' ', 3), ' ', -1) AS StudentLastName
-> from DemoTable1465;
실행 결과는 다음과 같습니다.
+------------------+-----------------+
| StudentFirstName | StudentLastName |
+------------------+-----------------+
| Chris | Brown |
| David | Miller |
| John | Doe |
+------------------+-----------------+
3 rows in set (0.00 sec)
쿼리 동작 원리
StudentFirstName (이름) 추출
substring_index(Name, ' ', 1)은 왼쪽에서 첫 번째 공백 앞까지의 문자열, 즉 첫 번째 단어를 반환합니다. 그 후 바깥쪽의 substring_index(..., ' ', -1)이 결과에서 마지막 단어를 한 번 더 추출하여 안정성을 높여줍니다.
StudentLastName (성) 추출
substring_index(Name, ' ', 3)은 왼쪽에서 세 번째 공백 앞까지의 전체 문자열을 먼저 가져온 뒤, 다시 오른쪽 기준(-1)으로 마지막 단어를 추출하여 성(last name)을 얻습니다. 이처럼 중첩 호출을 활용하면 단어 개수가 다른 문자열에서도 원하는 위치의 값을 정확하게 분리할 수 있습니다.