MySQL에서 두 컬럼의 값을 비교할 때 한쪽 컬럼에 NULL이 포함되어 있으면, 일반적인 비교 연산자만으로는 의도한 결과를 얻기 어렵습니다. 이런 경우 IFNULL() 함수를 사용하면 NULL 값을 0과 같은 기본값으로 치환해 손쉽게 비교할 수 있습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Value1 int,
Value2 int
);
Query OK, 0 rows affected (0.75 sec)2. 데이터 삽입하기
INSERT 명령어로 레코드를 추가합니다. 일부 레코드에는 의도적으로 NULL 값을 넣겠습니다.
mysql> insert into DemoTable values(10,NULL); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(20,40); Query OK, 1 row affected (0.27 sec) mysql> insert into DemoTable values(3,NULL); Query OK, 1 row affected (0.20 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+--------+ | Value1 | Value2 | +--------+--------+ | 10 | NULL | | 20 | 40 | | 3 | NULL | +--------+--------+ 3 rows in set (0.00 sec)
4. IFNULL()로 NULL 값이 있는 행만 조회하기
다음은 Value2가 NULL인 행만 골라서 표시하는 쿼리입니다. IFNULL(Value2, 0)을 통해 NULL을 0으로 바꾼 뒤 Value1과 비교합니다.
mysql> select *from DemoTable where Value1 > IFNULL(Value2,0);
실행 결과는 다음과 같습니다.
+--------+--------+ | Value1 | Value2 | +--------+--------+ | 10 | NULL | | 3 | NULL | +--------+--------+ 2 rows in set (0.00 sec)
IFNULL() 동작 원리 정리
IFNULL(표현식, 대체값)은 첫 번째 인자가 NULL이 아니면 해당 값을 그대로 반환하고, NULL이면 두 번째 인자로 지정한 대체값을 반환합니다. 위 예제에서는 Value2가 NULL인 행이 0으로 평가되므로 'Value1 > 0' 조건을 만족해 결과에 포함되고, Value2가 40인 행은 20 > 40이 거짓이므로 제외됩니다. 참고로 COALESCE() 함수를 사용해도 동일한 결과를 얻을 수 있으며, COALESCE()는 여러 인자 중 NULL이 아닌 첫 번째 값을 반환한다는 점이 다릅니다.