MySQL에서 데이터를 정렬할 때 일반적으로는 오름차순(ASC)이나 내림차순(DESC)을 사용하지만, 때로는 개발자가 직접 지정한 특정 문자열 순서대로 결과를 정렬해야 하는 경우가 있습니다. 이럴 때 유용하게 쓸 수 있는 것이 바로 FIELD() 함수입니다.
FIELD() 함수 기본 문법
FIELD() 함수를 활용한 ORDER BY 절의 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName ORDER BY FIELD(yourColumnName, 'yourValue1', 'yourValue2', 'yourValue3', ....N);
FIELD() 함수는 첫 번째 인수로 정렬 기준이 될 컬럼명을 받고, 그 뒤에 원하는 순서대로 값을 나열합니다. 나열된 값의 위치에 따라 행들이 정렬되며, 목록에 없는 값들은 가장 뒤쪽으로 배치됩니다.
예제 테이블 생성하기
문법을 실제로 이해하기 위해 예제 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 자동차 이름을 저장하는 테이블을 생성합니다.
mysql> create table OrderByListOfStrings
-> (
-> Id int not null auto_increment,
-> CarName varchar(20),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.68 sec)샘플 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into OrderByListOfStrings(CarName) values('Ford');
Query OK, 1 row affected (0.18 sec)
mysql> insert into OrderByListOfStrings(CarName) values('Audi');
Query OK, 1 row affected (0.17 sec)
mysql> insert into OrderByListOfStrings(CarName) values('Honda');
Query OK, 1 row affected (0.13 sec)
mysql> insert into OrderByListOfStrings(CarName) values('Aston Martin');
Query OK, 1 row affected (0.53 sec)
mysql> insert into OrderByListOfStrings(CarName) values('Bugatti');
Query OK, 1 row affected (0.20 sec)
mysql> insert into OrderByListOfStrings(CarName) values('BMW');
Query OK, 1 row affected (0.21 sec)전체 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from OrderByListOfStrings;
실행 결과는 다음과 같습니다.
+----+--------------+ | Id | CarName | +----+--------------+ | 1 | Ford | | 2 | Audi | | 3 | Honda | | 4 | Aston Martin | | 5 | Bugatti | | 6 | BMW | +----+--------------+ 6 rows in set (0.00 sec)
원하는 순서대로 정렬하기
이제 FIELD() 함수를 사용해 원하는 문자열 순서대로 정렬해 보겠습니다. 여기서는 Bugatti → BMW → Audi → Aston Martin → Ford → Honda 순서로 정렬하도록 지정했습니다.
mysql> select *from OrderByListOfStrings
-> order by field(CarName,'Bugatti','BMW','Audi','Aston Martin','Ford','Honda');FIELD() 메서드가 적용된 결과, 지정한 순서대로 문자열이 재배치된 것을 확인할 수 있습니다.
+----+--------------+ | Id | CarName | +----+--------------+ | 5 | Bugatti | | 6 | BMW | | 2 | Audi | | 4 | Aston Martin | | 1 | Ford | | 3 | Honda | +----+--------------+ 6 rows in set (0.00 sec)
마무리 및 참고 사항
이처럼 MySQL의 FIELD() 함수를 활용하면 알파벳순이나 숫자순이 아닌, 비즈니스 로직에 맞는 커스텀 정렬을 손쉽게 구현할 수 있습니다. 예를 들어 상태값('진행중', '완료', '보류')이나 카테고리 우선순위 등을 특정 순서로 표시해야 할 때 매우 유용합니다.
다만 주의할 점도 있습니다. FIELD() 함수는 인덱스를 활용하지 못하기 때문에 대량의 데이터를 다룰 경우 성능 저하가 발생할 수 있습니다. 또한 목록에 포함되지 않은 값은 항상 마지막에 배치되므로, 필요하다면 ELSE 처리나 별도의 정렬 조건을 함께 고려하는 것이 좋습니다.