MySQL에서 CASE WHEN으로 사용자 지정 순서 정렬하기
MySQL에서 데이터를 특정 조건에 따라 원하는 순서대로 정렬하려면 ORDER BY 절과 CASE 문을 함께 사용하면 됩니다. 이 방법은 기본적인 오름차순(ASC)이나 내림차순(DESC) 정렬이 아닌, 개발자가 직접 정의한 우선순위대로 결과를 정렬해야 할 때 매우 유용합니다.
먼저 예제로 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable(
Color varchar(100)
);
Query OK, 0 rows affected (0.64 sec)
1. 테이블 생성 및 데이터 삽입
INSERT 명령어를 사용하여 테이블에 샘플 데이터를 입력합니다.
mysql> insert into DemoTable values('Red');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Green');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Blue');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Yellow');
Query OK, 1 row affected (0.18 sec)2. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+
| Color |
+--------+
| Red |
| Green |
| Blue |
| Yellow |
+--------+
4 rows in set (0.00 sec)
3. CASE WHEN을 활용한 정렬 쿼리
이제 CASE WHEN 구문을 사용하여 색상별로 원하는 출력 순서를 직접 지정해 보겠습니다. 아래 쿼리는 Blue → Green → Yellow → Red 순서로 정렬합니다.
mysql> select *from DemoTable
order by case Color
when 'Blue' then 10
when 'Green' then 20
when 'Yellow' then 30
else 100 end;
실행 결과는 다음과 같습니다.
+--------+
| Color |
+--------+
| Blue |
| Green |
| Yellow |
| Red |
+--------+
4 rows in set (0.00 sec)
동작 원리
위 쿼리는 각 행의 Color 값에 따라 임시 숫자 값을 부여합니다. 'Blue'에는 10, 'Green'에는 20, 'Yellow'에는 30이 할당되고, 나머지 값(Red)은 ELSE 절에 의해 100이 할당됩니다. 이후 ORDER BY가 이 숫자 값을 기준으로 오름차순 정렬하기 때문에 10 → 20 → 30 → 100 순서, 즉 Blue, Green, Yellow, Red 순으로 결과가 출력됩니다.
이처럼 CASE WHEN과 ORDER BY를 조합하면 알파벳 순서나 데이터 타입에 상관없이 비즈니스 로직에 맞는 자유로운 정렬이 가능합니다. 예를 들어 게시판에서 '공지사항'을 항상 최상단에 배치하거나, 상태값('진행 중', '대기', '완료') 순으로 목록을 정렬할 때 널리 활용됩니다.