MySQL SUBSTRING_INDEX() 함수로 이름 문자열을 두 부분으로 나누는 방법
이해를 돕기 위해 customerdetail 테이블에 저장된 다음 데이터를 사용하겠습니다.
mysql> Select * from Customerdetail; +----------------------+----------------------+-----------+---------------------+ | Name | FName | Address | Emailid | +----------------------+----------------------+-----------+---------------------+ | Advik Jhamb | Lovkesh Jhamb | Mumbai | Advik@gmail.com | | Chirag Jai Patil | Raman Jai Patil | Gujrat | chirahp@yahoo.com | | Devansh Singh Rajput | Kishore Singh Rajput | Rajasthan | Devansh@Hotmail.com | | Mitul Kumar Sharma | Om Veer Sharma | Patiala | Mitul@gmail.com | +----------------------+----------------------+-----------+---------------------+ 4 rows in set (0.00 sec)
Name 열에는 이름과 성이 함께 저장되어 있으며, 'Chirag Jai Patil'처럼 이름·중간 이름·성 세 부분으로 구성된 데이터도 포함되어 있습니다.
이제 전체 이름을 'First_Name'(이름)과 'Last_Name'(성), 두 부분으로 분할하려면 다음 쿼리를 사용하면 됩니다.
mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(Name, ' ', 1), ' ', -1) AS First_Name, TRIM( SUBSTR(Name, LOCATE(' ', Name)) ) AS Last_Name FROM Customerdetail;
+------------+--------------+
| First_Name | Last_Name |
+------------+--------------+
| Advik | Jhamb |
| Chirag | Jai Patil |
| Devansh | Singh Rajput |
| Mitul | Kumar Sharma |
+------------+--------------+
4 rows in set (0.00 sec)쿼리 동작 원리
First_Name 추출: SUBSTRING_INDEX(Name, ' ', 1)은 첫 번째 공백을 기준으로 그 앞에 있는 문자열, 즉 첫 번째 단어(이름)를 반환합니다. 여기에 SUBSTRING_INDEX(..., ' ', -1)을 한 번 더 감싸 어떤 경우에도 첫 단어만 안정적으로 남도록 처리했습니다.
Last_Name 추출: LOCATE(' ', Name)으로 첫 번째 공백의 위치를 찾고, SUBSTR()로 해당 위치 이후의 모든 문자열을 가져온 뒤 TRIM()으로 앞뒤 공백을 제거합니다. 그 결과 나머지 전체가 Last_Name이 됩니다.
결과 집합에서 확인할 수 있듯이 이름이 성공적으로 두 부분으로 나뉘었습니다. 특히 주목할 점은 중간 이름(Middle Name)이 성(Last Name)의 일부로 간주된다는 것입니다. 예를 들어 'Chirag Jai Patil'은 First_Name이 'Chirag', Last_Name이 'Jai Patil'로 분할됩니다. 이 방식은 이름 구분자가 공백으로 되어 있는 데이터를 정규화할 때 매우 유용하게 활용할 수 있습니다.