NVL, NVL2, COALESCE의 차이 – NULL 처리 함수 완전 정복
SQL을 작성하다 보면 NULL
값을 다른 값으로 대체해야 할 일이 자주 발생합니다. 이때 사용하는 대표적인 함수로 NVL
, NVL2
, COALESCE
가 있으며, 모두 오라클에서 널 처리에 사용됩니다. 이름은 비슷하지만 동작 방식과 활용도에는 차이가 있기 때문에 정확히 구분하고 사용하는 것이 중요합니다.
이 글에서는 세 함수의 문법, 차이점, 예제, 실무 팁까지 함께 정리합니다.
1. NVL – 기본적인 NULL 대체
NVL
은 가장 단순한 널 처리 함수로, NULL이면 지정한 값으로 대체하고, NULL이 아니면 원래 값을 그대로 반환합니다.
NVL(표현식, 대체값)
예시:
SELECT NVL(NULL, 'N/A') FROM DUAL; -- 결과: 'N/A'
SELECT NVL('ABC', 'N/A') FROM DUAL; -- 결과: 'ABC'
주의할 점은 데이터 타입이 일치해야 한다는 점입니다. 숫자와 문자열을 섞으면 오류가 납니다.
SELECT NVL(100, '없음') FROM DUAL; -- 오류 발생
2. NVL2 – NULL 여부에 따라 두 값을 선택
NVL2
는 NULL이냐 아니냐
에 따라 두 개의 다른 값을 선택할 수 있습니다.
NVL2(표현식, NOT_NULL일 때 반환값, NULL일 때 반환값)
예시:
SELECT NVL2(NULL, 'Y', 'N') FROM DUAL; -- 결과: 'N'
SELECT NVL2('데이터', 'Y', 'N') FROM DUAL; -- 결과: 'Y'
즉, IF 문으로 치면 다음과 같은 형태입니다.
IF (표현식 IS NOT NULL) THEN A ELSE B
단순 대체가 아니라 두 갈래 조건 분기가 필요할 때 유용합니다.
3. COALESCE – 첫 번째 NOT NULL 값을 반환
COALESCE
는 인수들을 왼쪽부터 검사하여 첫 번째로 NULL이 아닌 값을 반환합니다. 인수는 2개 이상 받을 수 있고, 여러 후보 중 유효한 값을 찾을 때 매우 유용합니다.
COALESCE(표현식1, 표현식2, ..., 표현식N)
예시:
SELECT COALESCE(NULL, NULL, '대체', '기본') FROM DUAL; -- 결과: '대체'
NVL
과 다르게 여러 후보를 순차적으로 검사할 수 있고, 타입 자동 변환도 좀 더 유연합니다.
세 함수 비교 정리
항목 | NVL | NVL2 | COALESCE |
---|---|---|---|
사용 목적 | NULL이면 대체 | NULL 여부로 분기 | 여러 후보 중 첫 NOT NULL |
인수 개수 | 2개 | 3개 | 2개 이상 |
가독성 | 간단 | 조건 분기에 적합 | 유연한 NULL 처리 |
데이터 타입 | 동일 타입 요구 | 자유 | 자동 변환 가능 |
표준 SQL 여부 | 오라클 전용 | 오라클 전용 | SQL 표준 지원 |
실무 활용 팁
- 단순한 기본값 설정:
NVL
- NULL 여부에 따라 값 분기:
NVL2
- 여러 후보 중 유효값 찾기:
COALESCE
- 이식성과 SQL 표준을 고려한다면
COALESCE
를 우선 고려하는 것이 좋습니다.
예: 고객 이름이 NULL이면 닉네임, 닉네임도 없으면 '비회원'을 보여주고 싶을 때
SELECT COALESCE(NAME, NICKNAME, '비회원') FROM USER_TABLE;
마무리
NVL
, NVL2
, COALESCE
는 모두 NULL 값을 처리하는 데 유용하지만, 목적과 상황에 따라 적절한 함수를 선택해야 합니다. 단순히 외워서 사용하는 것이 아니라, 동작 방식과 차이를 이해하고 쿼리 목적에 맞게 활용하는 것이 중요합니다.
#NULL처리 #NVL함수 #COALESCE #오라클SQL #SQL기초 #오라클쿼리 #NVL2사용법 #NULL함수비교
'오라클 실무 쿼리 튜닝' 카테고리의 다른 글
DECODE vs CASE – 오라클에서 조건 분기를 처리하는 두 가지 방법 비교 (2) | 2025.07.28 |
---|---|
MERGE 문을 활용한 UPSERT – 오라클에서 조건부 INSERT/UPDATE 처리하는 방법 (0) | 2025.07.21 |
오라클 옵티마이저 통계 수집 실무 가이드 – 자동 수집 vs 수동 수집, 무엇이 더 좋을까? (0) | 2025.05.16 |
서브쿼리 성능 최적화 – 서브쿼리에서 성능을 끌어올리는 5가지 방법 (0) | 2025.04.16 |
WHERE 조건은 인덱스를 타는데 왜 느릴까? – INDEX RANGE SCAN의 함정과 대처법 (0) | 2025.04.15 |