쉼표로 구분된 결과에 포함된 숫자를 변환하려면 CASE 문과 FIND_IN_SET() 함수를 함께 사용해야 합니다. 이 글에서는 '2,4,6'처럼 저장된 월 번호 데이터를 'February,April,June'과 같은 월 이름으로 바꾸는 방법을 단계별로 살펴보겠습니다.
1단계: 테이블 생성하기
먼저 월 정보를 저장할 테이블을 생성합니다.
mysql> create table DemoTable1629
-> (
-> Month varchar(100)
-> );
Query OK, 0 rows affected (0.64 sec)
2단계: 샘플 데이터 삽입하기
insert 명령을 사용하여 쉼표로 구분된 월 번호 데이터를 입력합니다.
mysql> insert into DemoTable1629 values('2,4,6');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1629 values('1,3,5,12');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1629 values('7,8,9,10');
Query OK, 1 row affected (0.15 sec)3단계: 저장된 데이터 확인하기
select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1629;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----------+
| Month |
+----------+
| 2,4,6 |
| 1,3,5,12 |
| 7,8,9,10 |
+----------+
3 rows in set (0.00 sec)
4단계: 숫자를 월 이름으로 변환하는 쿼리 작성하기
다음은 쉼표로 구분된 각 숫자를 해당 월의 영문 이름으로 변환하는 쿼리입니다. FIND_IN_SET() 함수는 첫 번째 인수가 두 번째 인수(쉼표로 구분된 문자열) 안에 존재하는지 검사하고, CASE 문은 존재할 경우 해당 월 이름을 반환합니다. 마지막으로 CONCAT()으로 이어 붙인 후 TRIM()으로 끝의 불필요한 쉼표를 제거합니다.
mysql> select trim(trailing ',' from concat(
-> CASE WHEN FIND_IN_SET(1, Month) THEN 'January,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(2, Month) THEN 'February,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(3, Month) THEN 'March,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(4, Month) THEN 'April,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(5, Month) THEN 'May,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(6, Month) THEN 'June,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(7, Month) THEN 'July,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(8, Month) THEN 'August,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(9, Month) THEN 'September,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(10,Month) THEN 'October,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(11,Month) THEN 'November,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(12,Month) THEN 'December,' ELSE '' END
-> ))
-> from DemoTable1629;
위 쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
+------------------------------+
| converted months |
+------------------------------+
| February,April,June |
| January,March,May,December |
| July,August,September,October |
+------------------------------+
3 rows in set (0.04 sec)
쿼리 동작 원리 정리
이 쿼리의 핵심은 세 가지 함수의 조합입니다. 먼저 FIND_IN_SET(숫자, 컬럼)은 '2,4,6' 같은 문자열에서 특정 숫자가 몇 번째 위치에 있는지 반환하며, 없으면 0을 반환합니다. 다음으로 CASE WHEN은 해당 숫자가 존재할 때만 월 이름을 반환하여 조건부 변환을 수행합니다. 마지막으로 TRIM(TRAILING ',' FROM ...)은 여러 월 이름을 연결한 뒤 마지막에 남는 쉼표를 깔끔하게 제거해 줍니다.
참고로 이 방식은 데이터 정규화 관점에서 권장되지 않는 쉼표 구분형 저장 구조를 다룰 때 유용한 임시 해결책입니다. 새로운 프로젝트라면 별도의 매핑 테이블이나 JSON 타입 컬럼을 사용하는 것이 더 나은 설계입니다.