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

MySQL에서 전달된 ID 순서 그대로 정렬하기 – ORDER BY CASE 완벽 가이드

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 절에 나열한 순서가 곧 출력 순서가 되는 것입니다.

이 기법은 게시글 목록에서 특정 항목을 상단에 고정하거나, 사용자가 선택한 항목을 선택 순서대로 표시해야 하는 경우 등 다양한 실무 시나리오에서 활용할 수 있습니다.