MySQL에서 IN 조건으로 여러 ID를 조회할 때, 결과가 원하는 순서대로 나오지 않아 불편했던 경험이 있으신가요? 기본적으로 MySQL은 지정한 ID 순서를 보장하지 않기 때문에, 별도의 정렬 로직이 필요합니다. 이럴 때 유용하게 쓸 수 있는 것이 바로 ORDER BY CASE 문입니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1550
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.61 sec)
2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1550 values(101,'Chris');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1550 values(110,'Bob');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable1550 values(105,'Carol');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1550 values(109,'Mike');
Query OK, 1 row affected (0.17 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1550;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 101 | Chris |
| 110 | Bob |
| 105 | Carol |
| 109 | Mike |
+------+-------+
4 rows in set (0.00 sec)
4. ORDER BY CASE로 원하는 순서 유지하기
이제 핵심입니다. 전달된 ID 순서(109 → 101 → 110) 그대로 결과를 정렬하려면 아래와 같이 ORDER BY CASE 문을 사용하면 됩니다.
mysql> select * from DemoTable1550
-> where Id IN(109,101,110)
-> order by case Id
-> when 109 then 1001
-> when 101 then 1002
-> when 110 then 1003
-> end;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 109 | Mike |
| 101 | Chris |
| 110 | Bob |
+------+-------+
3 rows in set (0.00 sec)
동작 원리 정리
CASE 표현식은 각 ID에 임의의 우선순위 값(1001, 1002, 1003)을 부여하고, ORDER BY가 이 값을 기준으로 오름차순 정렬하기 때문에 우리가 지정한 순서대로 결과가 반환됩니다. 즉, WHEN 절에 나열한 순서가 곧 출력 순서가 되는 것입니다.
이 기법은 게시글 목록에서 특정 항목을 상단에 고정하거나, 사용자가 선택한 항목을 선택 순서대로 표시해야 하는 경우 등 다양한 실무 시나리오에서 활용할 수 있습니다.