Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 쉼표로 구분된 숫자를 월 이름으로 변환하는 방법

쉼표로 구분된 결과에 포함된 숫자를 변환하려면 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 타입 컬럼을 사용하는 것이 더 나은 설계입니다.