IFNULL 함수와 NVL 함수는 유사하게 동작하며, NVL 함수는 집합형 데이터 타입을 추가로 지원한다. 두 개의 인자가 지정되며, 첫 번째 인자 expr1이 NULL이 아니면 expr1을 반환하고, NULL이면 두 번째 인자인 expr2를 반환한다.
IFNULL 함수와 NVL 함수는 인자의 타입 중 우선순위가 가장 높은 타입으로 모든 인자를 변환하여 연산을 수행한다. 인자 중에 같은 타입으로 변환할 수 없는 타입의 인자가 있으면 모든 인자를 VARCHAR 타입으로 변환한다. 아래는 입력 인자의 타입에 따른 변환 우선순위를 나타낸 것이다.
예를 들어 a의 타입이 INT, b의 타입이 BIGINT이면 IFNULL(a, b)은 BIGINT 타입을 반환한다. 만약 a의 타입이 INTEGER, b의 타입이 TIMESTAMP이면 IFNULL(a, b)은 VARCHAR 타입을 반환한다.
IFNULL( expr1, expr2 )
NVL( expr1, expr2 )
result :
expr1 | expr2
IFNULL(a, b) 또는 NVL(a, b)는 다음의 CASE 문장과 같은 의미를 가진다.
CASE WHEN a IS NULL THEN b
ELSE a
END
SELECT * FROM case_tbl;
a
=============
1
2
3
NULL
--returning a specific value when a is NULL
SELECT a, NVL(a, 10.0000) FROM case_tbl;
a nvl(a, 10.0000)
===================================
1 1.0000
2 2.0000
3 3.0000
NULL 10.0000
--IFNULL can be used instead of NVL and return values are converted to the string type
SELECT a, IFNULL(a, 'UNKNOWN') FROM case_tbl;
a ifnull(a, 'UNKNOWN')
===================================
1 '1'
2 '2'
3 '3'
NULL 'UNKNOWN'