MySQL에서 특정 조건에 따라 레코드를 정렬하고 싶을 때는 ORDER BY 절과 함께 NULLIF() 함수를 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 테이블 생성부터 데이터 삽입, 그리고 CASE 방식의 정렬까지 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable672(
CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName varchar(100),
CustomerAmount int
);
Query OK, 0 rows affected (0.81 sec)2. 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable672(CustomerName,CustomerAmount) values('Chris',560);
Query OK, 1 row affected (0.51 sec)
mysql> insert into DemoTable672(CustomerName,CustomerAmount) values('Robert',null);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable672(CustomerName,CustomerAmount) values('',450);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable672(CustomerName,CustomerAmount) values('David',456);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable672(CustomerName,CustomerAmount) values('Carol',786);
Query OK, 1 row affected (0.14 sec)3. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable672;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+------------+--------------+----------------+ | CustomerId | CustomerName | CustomerAmount | +------------+--------------+----------------+ | 1 | Chris | 560 | | 2 | Robert | NULL | | 3 | | 450 | | 4 | David | 456 | | 5 | Carol | 786 | +------------+--------------+----------------+ 5 rows in set (0.00 sec)
4. CASE 방식으로 ORDER BY 정렬하기
이제 MySQL에서 CASE처럼 조건 기반 정렬을 수행하는 방법을 살펴보겠습니다. 아래 쿼리에서는 NULLIF()로 빈 문자열이나 NULL 값을 먼저 처리하고, FIELD() 함수를 사용해 대소문자를 구분하지 않고 원하는 순서대로 정렬했습니다.
mysql> select *from DemoTable672 ORDER BY NULLIF(CustomerName,'') IS NULL, FIELD(CustomerAmount,560,786,450,456);
실행 결과는 다음과 같습니다.
+------------+--------------+----------------+ | CustomerId | CustomerName | CustomerAmount | +------------+--------------+----------------+ | 2 | Robert | NULL | | 1 | Chris | 560 | | 5 | Carol | 786 | | 4 | David | 456 | | 3 | | 450 | +------------+--------------+----------------+ 5 rows in set (0.04 sec)
정렬 로직 설명
결과를 자세히 보면 두 가지 정렬 규칙이 적용된 것을 알 수 있습니다.
첫 번째 조건: NULLIF(CustomerName,'') IS NULL — 고객 이름이 빈 문자열('')이면 NULLIF가 NULL을 반환하므로 해당 행이 가장 앞쪽으로 정렬됩니다. 즉, 이름이 없는 레코드를 우선적으로 배치할 수 있습니다.
두 번째 조건: FIELD(CustomerAmount,560,786,450,456) — FIELD() 함수는 지정한 값 목록에서 각 행의 값이 몇 번째 위치에 있는지를 반환합니다. 따라서 금액이 560인 행이 첫 번째, 786이 두 번째, 450이 세 번째, 456이 네 번째 순서로 정렬되며, 목록에 없는 값(NULL 등)은 0을 반환해 맨 앞에 위치하게 됩니다.
이처럼 NULLIF()와 FIELD() 함수를 조합하면 복잡한 CASE 표현식 없이도 유연하고 직관적인 커스텀 정렬을 구현할 수 있습니다.