MySQL에서 WHERE 조건에 해당하는 레코드가 하나도 없을 경우, 쿼리 결과는 '빈 세트(Empty set)'로 반환됩니다. 하지만 실무에서는 결과가 비어 있을 때 NULL 대신 'false'나 0 같은 기본값을 표시하고 싶은 경우가 많습니다. 이럴 때 COALESCE 함수를 활용하면 간단하게 해결할 수 있습니다.
COALESCE 함수란?
COALESCE는 인수로 전달된 값 중 첫 번째로 NULL이 아닌 값을 반환하는 MySQL 함수입니다. 집계 함수(MAX, SUM 등)의 결과가 NULL일 때 기본값을 지정하는 용도로 널리 사용됩니다.
1단계: 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Code varchar(20)
-> );
Query OK, 0 rows affected (1.64 sec)
2단계: 레코드 삽입
INSERT 명령으로 테이블에 샘플 데이터를 입력합니다.
mysql> insert into DemoTable values('10');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('45');
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('78');
Query OK, 1 row affected (0.21 sec)3단계: 저장된 레코드 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------+
| Code |
+------+
| 10 |
| 45 |
| 78 |
+------+
3 rows in set (0.00 sec)
4단계: COALESCE로 빈 세트 대체하기
이제 존재하지 않는 코드('90')를 조회하면서, 결과가 비어 있을 경우 'false' 문자열을 대신 반환하도록 쿼리를 작성합니다.
mysql> select COALESCE(MAX(Code), 'false') AS WhenReturnSetIsEmpty
-> from DemoTable
-> where Code='90';
Code가 '90'인 레코드는 테이블에 없으므로 MAX(Code)는 NULL을 반환하고, COALESCE가 이를 'false'로 대체합니다. 실행 결과는 다음과 같습니다.
+----------------------+
| WhenReturnSetIsEmpty |
+----------------------+
| false |
+----------------------+
1 row in set (0.00 sec)
동작 원리 정리
WHERE 조건에 일치하는 행이 없으면 MAX(Code)는 NULL을 반환합니다. 이때 COALESCE(NULL, 'false')는 두 번째 인수인 'false'를 그대로 돌려주기 때문에, 빈 세트 대신 의미 있는 기본값을 얻을 수 있습니다. 참고로 IFNULL() 함수를 사용해도 동일한 결과를 구현할 수 있습니다.