MySQL에서 날짜 열을 기준으로 정렬하면서, 특정 정수 열에는 사용자가 원하는 별도의 정렬 규칙을 적용하고 싶다면 ORDER BY CASE 문을 활용하면 됩니다. 이 방법을 사용하면 단순 오름차순·내림차순이 아닌, 조건에 따른 맞춤형 정렬이 가능합니다.
기본 문법
정수 열의 값에 따라 우선순위를 부여하고, 그다음 날짜 열을 기준으로 정렬하는 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName
ORDER BY CASE yourIntegerColumnName1 WHEN 2 THEN 1 ELSE 0 END DESC,
yourDateColumnName ASC;
위 문법은 정수 열의 값이 2인 행을 먼저 출력하고(DESC), 나머지 행들은 날짜 열을 기준으로 오름차순(ASC) 정렬합니다.
예제 테이블 생성
실제 동작을 확인하기 위해 예제 테이블을 만들어 보겠습니다.
mysql> create table OrderByCaseDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> GroupId int,
-> ArrivalDate date,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.57 sec)
데이터 삽입
INSERT 명령어를 사용해 테스트용 레코드를 추가합니다.
mysql> insert into OrderByCaseDemo(GroupId,ArrivalDate) values(2,'19/02/06');
Query OK, 1 row affected (0.13 sec)
mysql> insert into OrderByCaseDemo(GroupId,ArrivalDate) values(1,'20/02/06');
Query OK, 1 row affected (0.20 sec)
mysql> insert into OrderByCaseDemo(GroupId,ArrivalDate) values(3,'18/02/06');
Query OK, 1 row affected (0.12 sec)
mysql> insert into OrderByCaseDemo(GroupId,ArrivalDate) values(3,'21/02/06');
Query OK, 1 row affected (0.23 sec)
mysql> insert into OrderByCaseDemo(GroupId,ArrivalDate) values(2,'17/02/06');
Query OK, 1 row affected (0.17 sec)
mysql> insert into OrderByCaseDemo(GroupId,ArrivalDate) values(1,'22/02/06');
Query OK, 1 row affected (0.14 sec)
저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from OrderByCaseDemo;
실행 결과는 다음과 같습니다.
+----+---------+-------------+
| Id | GroupId | ArrivalDate |
+----+---------+-------------+
| 1 | 2 | 2019-02-06 |
| 2 | 1 | 2020-02-06 |
| 3 | 3 | 2018-02-06 |
| 4 | 3 | 2021-02-06 |
| 5 | 2 | 2017-02-06 |
| 6 | 1 | 2022-02-06 |
+----+---------+-------------+
6 rows in set (0.00 sec)
CASE문을 활용한 정렬 쿼리 실행
이제 날짜 열과 정수 열을 함께 정렬하는 쿼리를 실행해 보겠습니다. GroupId가 2인 데이터를 최우선으로 배치하고, 나머지는 도착 날짜(ArrivalDate) 순으로 정렬합니다.
mysql> select *from OrderByCaseDemo
order by case GroupId when 2 then 1 else 0 end desc,ArrivalDate asc;
실행 결과
+----+---------+-------------+
| Id | GroupId | ArrivalDate |
+----+---------+-------------+
| 5 | 2 | 2017-02-06 |
| 1 | 2 | 2019-02-06 |
| 3 | 3 | 2018-02-06 |
| 2 | 1 | 2020-02-06 |
| 4 | 3 | 2021-02-06 |
| 6 | 1 | 2022-02-06 |
+----+---------+-------------+
6 rows in set (0.00 sec)
결과 분석
출력 결과를 살펴보면 GroupId가 2인 두 개의 행(Id 5, Id 1)이 가장 먼저 표시되고, 그 뒤로 나머지 행들이 ArrivalDate 기준 오름차순으로 정렬된 것을 확인할 수 있습니다.
이처럼 ORDER BY 절 안에서 CASE 문을 사용하면 특정 조건을 만족하는 행에 우선순위를 부여하면서, 동시에 다른 열의 자연스러운 정렬 순서도 유지할 수 있습니다. 우선순위를 여러 단계로 나누고 싶다면 WHEN 절을 추가하여 더욱 세밀한 정렬 규칙도 구현할 수 있습니다.