MySQL에서 IFNULL()로 조건부 정렬 구현하기
MySQL에서 특정 컬럼의 값이 NULL이 아닐 경우에는 해당 컬럼을 기준으로 정렬하고, NULL일 경우에는 다른 컬럼을 기준으로 정렬해야 하는 경우가 있습니다. 이런 조건부 정렬은 ORDER BY IFNULL() 함수를 사용하면 간단하게 구현할 수 있습니다.
IFNULL(값1, 값2)는 첫 번째 인자가 NULL이 아니면 그 값을 그대로 반환하고, NULL이면 두 번째 인자를 반환하는 함수입니다. 이 특성을 활용하면 원하는 정렬 로직을 손쉽게 만들 수 있습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Name varchar(20),
-> CountryName varchar(20)
-> );
Query OK, 0 rows affected (0.61 sec)
2. 데이터 삽입
insert 명령어를 사용해 테이블에 레코드를 삽입합니다. Name 또는 CountryName이 NULL인 데이터를 의도적으로 포함시켰습니다.
mysql> insert into DemoTable values('Chris',NULL);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('David','AUS');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(NULL,'UK');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(NULL,'AUS');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(NULL,NULL);
Query OK, 1 row affected (0.11 sec)
3. 전체 레코드 조회
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+-------------+ | Name | CountryName | +-------+-------------+ | Chris | NULL | | David | AUS | | NULL | UK | | NULL | AUS | | NULL | NULL | +-------+-------------+ 5 rows in set (0.00 sec)
4. 조건부 정렬 쿼리 실행
Name 컬럼이 NULL이 아니면 Name을 기준으로, NULL이면 CountryName을 기준으로 정렬하는 쿼리입니다.
mysql> select *from DemoTable
-> order by ifnull(Name,CountryName);
실행 결과는 다음과 같습니다.
+-------+-------------+ | Name | CountryName | +-------+-------------+ | NULL | NULL | | NULL | AUS | | Chris | NULL | | David | AUS | | NULL | UK | +-------+-------------+ 5 rows in set (0.00 sec)
결과 분석
정렬 결과에서 적용된 규칙을 확인할 수 있습니다.
- (NULL, NULL) : 두 컬럼 모두 NULL이라 대체값이 없어 가장 앞에 위치합니다.
- (NULL, AUS) : Name이 NULL이므로 CountryName인 'AUS'를 기준으로 정렬됩니다.
- (Chris, NULL) : Name이 NULL이 아니므로 'Chris'를 기준으로 정렬됩니다.
- (David, AUS) : Name이 NULL이 아니므로 'David'를 기준으로 정렬됩니다.
- (NULL, UK) : Name이 NULL이므로 CountryName인 'UK'를 기준으로 정렬됩니다.
MySQL은 문자열 오름차순 정렬 시 NULL을 가장 작은 값으로 취급하기 때문에 (NULL, NULL)과 (NULL, AUS)가 먼저 출력되고, 이후 'Chris' → 'David' → 'UK' 순서로 정렬됩니다.
참고: COALESCE() 함수 활용
IFNULL() 외에도 표준 SQL 함수인 COALESCE()를 사용해 동일한 결과를 얻을 수 있습니다.
mysql> select *from DemoTable
-> order by coalesce(Name, CountryName);
IFNULL()은 인자를 두 개만 받을 수 있지만, COALESCE()는 여러 개의 인자를 받아 NULL이 아닌 첫 번째 값을 반환합니다. 따라서 세 개 이상의 컬럼을 우선순위대로 정렬해야 할 때는 COALESCE()가 더 유용합니다.