개요
MySQL에서는 FIELD() 함수와 OR 조건을 함께 사용하면 특정 값을 원하는 우선순위대로 정렬할 수 있습니다. 이 글에서는 실제 예제를 통해 ORDER BY FIELD()의 활용법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1884
(
Marks int
);
Query OK, 0 rows affected (0.00 sec)2. 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 샘플 레코드를 추가합니다.
mysql> insert into DemoTable1884 values(55); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1884 values(97); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1884 values(79); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1884 values(87); Query OK, 1 row affected (0.00 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블에 저장된 전체 레코드를 조회합니다.
mysql> select * from DemoTable1884;
실행 결과는 다음과 같습니다.
+-------+ | Marks | +-------+ | 55 | | 97 | | 79 | | 87 | +-------+ 4 rows in set (0.00 sec)
4. ORDER BY FIELD()와 OR 조건 함께 사용하기
아래 쿼리는 WHERE 절의 OR 조건과 FIELD() 함수를 결합하여, 지정한 값(98, 87)의 순서대로 결과를 정렬한 뒤 첫 번째 행만 반환합니다.
mysql> select * from DemoTable1884 where Marks = 98 or Marks = 87 order by field(Marks,98,87) limit 1;
실행 결과는 다음과 같습니다.
+-------+ | Marks | +-------+ | 87 | +-------+ 1 row in set (0.00 sec)
동작 원리 살펴보기
FIELD(Marks, 98, 87) 함수는 첫 번째 인수인 Marks 값이 뒤따르는 목록(98, 87) 중 몇 번째 위치에 해당하는지를 반환합니다. 즉, 98이면 1, 87이면 2를 반환하며 목록에 없는 값은 0을 반환합니다. 따라서 ORDER BY 절에 이 함수를 사용하면 98 → 87 순서로 정렬됩니다.
예제에서는 Marks가 98인 레코드가 테이블에 존재하지 않으므로, OR 조건에 일치하는 유일한 값인 87이 결과로 반환된 것입니다. 만약 98에 해당하는 데이터가 있다면 그 값이 먼저 출력되며, LIMIT 1은 정렬된 결과 중 최상위 한 건만 가져오도록 제한하는 역할을 합니다.
마무리
이처럼 ORDER BY FIELD()를 활용하면 CASE WHEN 문을 별도로 작성하지 않고도 사용자 지정 우선순위에 따라 간단하게 정렬할 수 있습니다. 특정 상태값이나 카테고리를 원하는 순서대로 조회해야 할 때 유용하게 사용할 수 있는 기법이니 참고해 보시기 바랍니다.