개요
MySQL에서 '/101/102/106'처럼 슬래시(/)로 구분된 문자열이 저장되어 있을 때, 그중 가운데 값만 추출하고 싶은 경우가 있습니다. 이때 SUBSTRING_INDEX 함수를 두 번 중첩하여 사용하면 간단하게 해결할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 알아보겠습니다.
1. 테이블 생성
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Code varchar(100)
-> );
Query OK, 0 rows affected (1.07 sec)
2. 데이터 삽입
INSERT 명령을 사용해 슬래시로 구분된 샘플 데이터를 입력합니다.
mysql> insert into DemoTable values('/101/102/106');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('/110/111/101');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('/111/114/201');
Query OK, 1 row affected (0.47 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+--------------+
| Code |
+--------------+
| /101/102/106 |
| /110/111/101 |
| /111/114/201 |
+--------------+
3 rows in set (0.00 sec)
4. 슬래시 사이의 중간 문자열 추출 쿼리
슬래시로 둘러싸인 가운데 문자열을 가져오는 쿼리는 다음과 같습니다.
mysql> select SUBSTRING_INDEX(SUBSTRING_INDEX(Code,'/',3),'/',-1) from DemoTable;
출력 결과
쿼리 실행 결과, 각 행에서 두 번째 위치에 있는 값이 정상적으로 추출됩니다.
+-----------------------------------------------------+
| SUBSTRING_INDEX(SUBSTRING_INDEX(Code,'/',3),'/',-1) |
+-----------------------------------------------------+
| 102 |
| 111 |
| 114 |
+-----------------------------------------------------+
3 rows in set (0.00 sec)
SUBSTRING_INDEX 동작 원리
이 쿼리가 작동하는 방식을 단계별로 살펴보면 다음과 같습니다.
- SUBSTRING_INDEX(Code, '/', 3) : 문자열에서 세 번째 슬래시 앞까지의 부분을 반환합니다. 예를 들어 '/101/102/106'은 '/101/102'가 됩니다.
- SUBSTRING_INDEX(결과값, '/', -1) : 앞 단계의 결과에서 마지막 슬래시 뒤에 있는 부분을 반환하므로 최종적으로 '102'라는 중간 값을 얻게 됩니다.
이처럼 SUBSTRING_INDEX 함수를 중첩하면 별도의 복잡한 파싱 로직 없이도 구분자로 나뉜 문자열에서 원하는 위치의 값을 손쉽게 추출할 수 있습니다.