MySQL에서 두 개의 필드를 기준으로 정렬할 때 NULL 값이 포함되어 있으면 단순한 ORDER BY 절만으로는 원하는 결과를 얻기 어렵습니다. 이럴 때 COALESCE() 함수를 활용하면 첫 번째 필드가 NULL일 경우 두 번째 필드의 값을 대신 사용하여 자연스러운 순서대로 정렬할 수 있습니다.
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable -> ( -> FirstName varchar(100), -> LastName varchar(100) -> ); Query OK, 0 rows affected (1.39 sec)
2. 레코드 삽입
INSERT 명령어를 사용하여 의도적으로 NULL 값을 포함한 레코드들을 삽입합니다.
mysql> insert into DemoTable values('Sam','Brown');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values(null,'Smith');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('David','Taylor');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('Mike',null);
Query OK, 1 row affected (0.45 sec)
3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+-----------+----------+ | FirstName | LastName | +-----------+----------+ | Sam | Brown | | NULL | Smith | | David | Taylor | | Mike | NULL | +-----------+----------+ 4 rows in set (0.06 sec)
4. COALESCE를 이용한 정렬 쿼리
두 개의 필드와 NULL 값을 모두 고려하여 이름순으로 정렬하려면 아래와 같이 COALESCE() 함수를 ORDER BY 절에 사용합니다.
mysql> select *from DemoTable order by coalesce(FirstName,LastName);
출력 결과
+-----------+----------+ | FirstName | LastName | +-----------+----------+ | David | Taylor | | Mike | NULL | | Sam | Brown | | NULL | Smith | +-----------+----------+ 4 rows in set (0.04 sec)
동작 원리
COALESCE(FirstName, LastName)는 FirstName 값이 NULL이 아니면 FirstName을 그대로 반환하고, NULL인 경우에는 LastName 값을 대신 반환합니다. 위 예제의 각 행에 적용해 보면 다음과 같습니다.
- David / Taylor → 'David' 기준으로 정렬
- Mike / NULL → 'Mike' 기준으로 정렬
- Sam / Brown → 'Sam' 기준으로 정렬
- NULL / Smith → FirstName이 NULL이므로 'Smith' 기준으로 정렬
그 결과 David → Mike → Sam → Smith 순으로 정렬이 깔끔하게 적용됩니다. 이처럼 COALESCE()는 NULL 값이 섞여 있는 여러 컬럼을 하나의 정렬 기준으로 통합해서 처리해야 할 때 매우 유용한 함수입니다.