MySQL에서 기본적인 오름차순(ASC)이나 내림차순(DESC) 정렬 대신 원하는 순서대로 데이터를 정렬해야 하는 경우가 종종 있습니다. 예를 들어 직급이나 상태 값처럼 비즈니스 로직에 따라 특정 순서를 부여해야 할 때 유용합니다. 이럴 때 ORDER BY 절과 FIELD() 함수를 함께 사용하면 손쉽게 사용자 지정 정렬을 구현할 수 있습니다.
이번 글에서는 실제 예제를 통해 FIELD() 함수를 활용한 커스텀 정렬 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 직책(Directation) 정보를 저장할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Designation varchar(100)
-> );
Query OK, 0 rows affected (1.65 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('Software Engineer');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Associate Software Engineer');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('Software Development Engineer');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Product Manager');
Query OK, 1 row affected (0.17 sec)3. 현재 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------------------------------+
| Designation |
+-------------------------------+
| Software Engineer |
| Associate Software Engineer |
| Software Development Engineer |
| Product Manager |
+-------------------------------+
4 rows in set (0.00 sec)
현재는 INSERT 순서대로 데이터가 저장되어 있으며, 별도의 정렬 기준은 적용되지 않은 상태입니다.
4. FIELD() 함수로 사용자 지정 정렬 적용
이제 FIELD() 함수를 사용해 원하는 순서대로 결과를 정렬해 보겠습니다. FIELD() 함수는 첫 번째 인수로 정렬 대상 컬럼을 받고, 이후 인수들에 나열된 값들의 순서를 기준으로 정렬 우선순위를 결정합니다.
mysql> select *from DemoTable
-> order by
field(Designation,'Associate Software Engineer','Software Engineer','Software Development Engineer','Product Manager');
실행 결과는 다음과 같습니다.
+-------------------------------+
| Designation |
+-------------------------------+
| Associate Software Engineer |
| Software Engineer |
| Software Development Engineer |
| Product Manager |
+-------------------------------+
4 rows in set (0.02 sec)
FIELD() 함수 동작 방식 이해하기
FIELD() 함수는 지정한 값 목록에서 해당 문자열이 처음 나타나는 위치(인덱스)를 반환합니다. 즉, 위 예제에서는 'Associate Software Engineer'가 1, 'Software Engineer'가 2, 'Software Development Engineer'가 3, 'Product Manager'가 4의 값을 가지게 되며, ORDER BY가 이 숫자를 기준으로 오름차순 정렬을 수행합니다.
참고로 FIELD() 함수에 포함되지 않은 값은 0을 반환하므로, 목록에 없는 값들은 항상 가장 앞쪽에 정렬됩니다. 만약 이러한 값들을 맨 뒤로 보내고 싶다면 ORDER BY FIELD(...) = 0, FIELD(...) 형태로 응용할 수 있습니다.
마무리
MySQL의 ORDER BY FIELD() 함수를 활용하면 알파벳 순서나 숫자 크기와 무관하게 비즈니스 요구사항에 맞는 자유로운 정렬 순서를 구현할 수 있습니다. CASE WHEN 문을 사용하는 방법도 있지만, FIELD() 함수가 더 간결하고 가독성이 좋아 간단한 커스텀 정렬에는 FIELD() 사용을 권장합니다.