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

MySQL에서 ENUM 타입 컬럼을 CASE 문으로 원하는 순서대로 정렬하는 방법

MySQL에서 ENUM 타입으로 정의된 컬럼을 기본 정렬 방식이 아닌, 사용자가 지정한 특정 순서대로 정렬하고 싶을 때가 있습니다. 이럴 때 ORDER BY 절과 CASE 문을 함께 사용하면 원하는 우선순위에 따라 데이터를 정렬할 수 있습니다.

예제 테이블 생성하기

먼저 ENUM 타입의 컬럼을 포함하는 테이블을 생성해 보겠습니다. 여기서는 카드 덱을 나타내는 DeckOfCards 컬럼을 만들어 보겠습니다.

mysql> create table DemoTable1461
    -> (
    -> DeckOfCards ENUM('K','J','A','Q')
    -> );
Query OK, 0 rows affected (0.64 sec)

테이블 생성이 완료되면 INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다.

mysql> insert into DemoTable1461 values('K');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1461 values('A');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1461 values('J');
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable1461 values('Q');
Query OK, 1 row affected (0.13 sec)

저장된 데이터 확인하기

SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable1461;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-------------+
| DeckOfCards |
+-------------+
| K           |
| A           |
| J           |
| Q           |
+-------------+
4 rows in set (0.00 sec)

현재 데이터는 입력된 순서 그대로 저장되어 있는 것을 확인할 수 있습니다.

CASE 문을 활용한 ENUM 값 정렬

이제 ENUM 타입의 값을 원하는 순서대로 정렬하는 쿼리를 살펴보겠습니다. 아래 예제에서는 A, K, Q, J 순서(카드 게임에서 흔히 사용되는 랭킹 순서)로 정렬합니다.

mysql> select * from DemoTable1461
    -> order by
    -> case DeckOfCards when 'A' then 100
    -> when 'K' then 101
    -> when 'Q' then 102
    -> else 103
    -> end;

쿼리 실행 결과는 다음과 같습니다.

+-------------+
| DeckOfCards |
+-------------+
| A           |
| K           |
| Q           |
| J           |
+-------------+
4 rows in set (0.00 sec)

동작 원리 설명

CASE 문은 각 ENUM 값에 임시 숫자 값을 매핑하는 역할을 합니다. 위 예제에서는 'A'에는 100, 'K'에는 101, 'Q'에는 102를 부여하고, 그 외의 값(J)에는 ELSE 절을 통해 103을 할당합니다. MySQL은 이 매핑된 숫자 값을 기준으로 오름차순 정렬하기 때문에, 결과적으로 A → K → Q → J 순서로 데이터가 출력됩니다.

이 방식의 장점은 ENUM 컬럼에 정의된 순서와 무관하게, 언제든지 비즈니스 로직에 맞는 사용자 지정 정렬 순서를 유연하게 적용할 수 있다는 점입니다. 정렬 순서를 변경하고 싶다면 CASE 문 내부의 숫자 값만 수정하면 됩니다.