728x90

1. NVL2 함수란?
Oracle SQL에서 NVL2() 함수는 주어진 표현식이 NULL이 아닌 경우와 NULL인 경우를 구분하여 각각 다른 결과를 반환할 수 있도록 해주는 조건 분기 함수입니다. IF-ELSE와 유사한 형태를 SQL 내에서 간단히 구현할 수 있어 실무에서 매우 유용하게 사용됩니다. 기본 문법은 다음과 같습니다:
NVL2(expr1, expr2, expr3)
- expr1: NULL 여부를 판단할 값
- expr2: expr1이 NULL이 아닐 경우 반환
- expr3: expr1이 NULL일 경우 반환
2. 기본 사용 예제
다음은 직원의 보너스가 있는 경우와 없는 경우를 구분하여 다른 메시지를 출력하는 예제입니다.
SELECT EMPLOYEE_NAME,
BONUS,
NVL2(BONUS, '보너스 있음', '보너스 없음') AS BONUS_STATUS
FROM EMPLOYEES;
BONUS 칼럼이 NULL이면 '보너스 없음', 값이 있으면 '보너스 있음'이 출력됩니다.
3. 숫자 연산 예제
NVL2를 활용하면 NULL 여부에 따라 숫자 연산 방식도 바꿀 수 있습니다.
SELECT ORDER_ID,
NVL2(DISCOUNT, PRICE * (1 - DISCOUNT), PRICE) AS FINAL_PRICE
FROM ORDERS;
DISCOUNT가 존재하면 할인을 적용하고, NULL이면 원가 그대로를 반환합니다.
4. 날짜 처리 예제
NVL2로 등록일이 없는 경우 현재 날짜를 대신 사용하도록 처리할 수 있습니다.
SELECT USER_ID,
NVL2(REG_DATE, REG_DATE, SYSDATE) AS VALID_DATE
FROM USERS;
등록일이 NULL이면 시스템 날짜를 대신 보여줍니다.
5. 실무 활용 예제
5-1. 고객 상태 분류
SELECT CUSTOMER_NAME,
LAST_LOGIN,
NVL2(LAST_LOGIN, '활동 중', '미접속') AS STATUS
FROM CUSTOMERS;
5-2. 배송 상태 분기 처리
SELECT ORDER_ID,
DELIVERY_DATE,
NVL2(DELIVERY_DATE, '배송 완료', '배송 예정') AS DELIVERY_STATUS
FROM ORDERS;
6. NVL vs NVL2 vs COALESCE 비교
| 함수명 | 기능 | 차이점 |
|---|---|---|
| NVL | NULL이면 대체값 반환 | 2개의 인자 사용 |
| NVL2 | NULL 여부에 따라 두 결과 중 선택 | 3개의 인자 사용 |
| COALESCE | 여러 인자 중 첫 번째 NOT NULL 반환 | 가변 인자 수, ANSI SQL 표준 |
7. 주의사항
- 타입 일치 주의: expr2와 expr3은 데이터 타입이 같아야 함
- 인덱스 주의: WHERE 절에 NVL2를 사용하면 인덱스 효율이 낮아질 수 있음
- CASE WHEN과 차이 이해: NVL2는 단순 조건일 때 더 간결함
8. 고급 활용 팁
- 로그 테이블에 값 유무에 따른 상태 로그 기록
- VIEW 정의 시 NULL 기반 조건 표현 간소화
- 보고서에서 문구 처리 시 가독성 개선에 유용
-- 예: NULL 유무에 따라 상태 텍스트 지정
SELECT ITEM_NAME,
NVL2(EXPIRE_DATE, '유통 중', '유통기한 미등록') AS EXPIRE_STATUS
FROM PRODUCTS;
9. 결론
Oracle의 NVL2 함수는 SQL 내에서 간단한 조건 분기 로직을 처리할 수 있는 매우 유용한 함수입니다. NVL보다 표현력이 더 풍부하며, 복잡한 CASE 문 없이도 간결하고 직관적인 쿼리를 구성할 수 있습니다. 실무에서는 보고서, 통계 분석, UI 데이터 처리 등 다양한 영역에서 활용할 수 있으며, 타입과 인덱스 관련 주의사항만 잘 숙지하면 효과적인 SQL 작성을 도와줍니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/
- Oracle SQL Language Reference (NVL2 Functions)
- 현업 개발 경험 기반 작성 및 예제 구성
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] NULLIF() 함수 완전 정복 : 두 값 비교로 NULL 반환하는 방식 (0) | 2025.06.07 |
|---|---|
| [ORACLE] NVL() 함수로 NULL 값을 기본 값으로 바꾸는 방법 (0) | 2025.06.07 |
| [ORACLE] ROWIDTOCHAR()로 ROWID를 문자형으로 변환하는 방법 (0) | 2025.06.07 |
| [ORACLE] CHARTOROWID() 함수 완벽 가이드 : 문자형 ROWID를 ROWID로 변환 (0) | 2025.06.06 |
| [ORACLE] RAWTOHEX() 함수 실무 활용 법 : 해시 값, 토큰 비교에 강력한 이유 (0) | 2025.06.06 |