네, 가능합니다. MySQL에서는 ORDER BY FIELD() 함수를 사용하면 쿼리 결과를 지정한 값 목록의 순서 그대로 반환할 수 있습니다.
일반적으로 IN(30, 19, 34, ...) 조건으로 조회하면 결과는 테이블에 저장된 순서대로 나오기 때문에, 원하는 순서대로 정렬하려면 별도의 처리가 필요합니다. 이때 FIELD()函数가 유용하게 사용됩니다.
예제 테이블 생성하기
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable -> ( -> Number int -> ); Query OK, 0 rows affected (0.54 sec)
샘플 데이터 삽입하기
INSERT 명령을 사용하여 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable values(19); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable values(30); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable values(34); Query OK, 1 row affected (0.32 sec) mysql> insert into DemoTable values(28); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable values(25); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(29); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(24); Query OK, 1 row affected (0.14 sec)
테이블 전체 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------+ | Number | +--------+ | 19 | | 30 | | 34 | | 28 | | 25 | | 29 | | 24 | +--------+ 7 rows in set (0.00 sec)
FIELD() 함수로 원하는 순서대로 정렬하기
다음은 결과를 값 목록과 동일한 순서로 반환하는 쿼리입니다.
mysql> select *from DemoTable -> ORDER BY FIELD(Number, 30,19,34,25,28,29,24) ;
실행 결과는 다음과 같이 지정한 순서(30 → 19 → 34 → 25 → 28 → 29 → 24) 그대로 출력됩니다.
+--------+ | Number | +--------+ | 30 | | 19 | | 34 | | 25 | | 28 | | 29 | | 24 | +--------+ 7 rows in set (0.00 sec)
참고 사항
FIELD(Number, 30, 19, 34, ...)는 첫 번째 인자인 Number 값이 뒤에 나열된 값들 중 몇 번째 위치와 일치하는지를 반환합니다. 예를 들어 Number가 30이면 1을, 19이면 2를 반환하며, 일치하는 값이 없으면 0을 반환합니다. 따라서 ORDER BY와 함께 사용하면 목록에 없는 값들은 가장 앞쪽에 오게 되므로 주의가 필요합니다.
또한 MariaDB에서도 동일하게 ORDER BY FIELD()를 지원하며, PostgreSQL에서는 CASE WHEN 또는 배열 인덱스를 활용한 방법으로 같은 기능을 구현할 수 있습니다.