728x90

1. NVL 함수란 무엇인가?
Oracle의 NVL() 함수는 NULL 값을 다른 값으로 대체할 수 있도록 해주는 함수입니다. SQL 문에서 NULL 값이 존재할 때 원하는 기본값으로 대체함으로써, 연산 오류 방지와 가독성 향상에 기여합니다. NVL 함수의 기본 문법은 다음과 같습니다:
NVL(expr1, expr2)
- expr1: NULL 여부를 판단할 표현식
- expr2: expr1이 NULL일 경우 반환할 값
2. 기본 사용 예제
다음 예제는 직원의 커미션이 NULL일 경우, '0'으로 대체하는 쿼리입니다.
SELECT EMPLOYEE_NAME,
COMMISSION_PCT,
NVL(COMMISSION_PCT, 0) AS COMMISSION_REPLACED
FROM EMPLOYEES;
위 쿼리에서는 COMMISSION_PCT가 NULL일 경우 0으로 바꿔서 출력합니다.
3. 숫자형 NULL 처리 예제
NULL 값으로 인한 산술 연산 오류를 방지하기 위해 NVL은 자주 사용됩니다.
SELECT ORDER_ID,
QUANTITY,
UNIT_PRICE,
NVL(QUANTITY, 0) * UNIT_PRICE AS TOTAL_PRICE
FROM ORDERS;
QUANTITY가 NULL일 경우 0으로 간주되어 계산이 진행됩니다.
4. 문자열 NULL 처리 예제
문자열 칼럼이 NULL일 경우, 사용자 친화적인 메시지로 바꾸는 예제입니다.
SELECT CUSTOMER_ID,
NVL(PHONE_NUMBER, '연락처 없음') AS CONTACT_INFO
FROM CUSTOMERS;
5. 날짜형 NULL 처리 예제
NULL 날짜값을 현재 날짜로 대체하는 예제입니다.
SELECT EMPLOYEE_ID,
NVL(HIRE_DATE, SYSDATE) AS VALIDATED_DATE
FROM EMPLOYEES;
6. 실무에서의 활용 전략
- 보고서 쿼리에서 NULL 출력 방지
- CASE 문과 함께 결합해 복잡한 로직 처리 가능
- 집계 함수와 함께 사용하여 결과 정확도 향상
예를 들어, NULL 값을 "미정"으로 출력하고 싶다면 다음과 같이 작성할 수 있습니다:
SELECT PRODUCT_NAME,
NVL(DESCRIPTION, '미정') AS DESCRIPTION_TEXT
FROM PRODUCTS;
7. NVL과 유사 함수 비교
| 함수명 | 설명 | 차이점 |
|---|---|---|
| NVL | NULL일 때 다른 값으로 대체 | 단일 표현식 평가, 타입 일치 필요 |
| NVL2 | NULL 여부에 따라 두 가지 값 중 하나 반환 | 세 개의 인자 사용 |
| COALESCE | 첫 번째 NOT NULL 값을 반환 | 여러 인자 입력 가능, 표준 SQL |
예시:
SELECT NVL2(COMMISSION_PCT, '커미션 있음', '커미션 없음') AS STATUS
FROM EMPLOYEES;
SELECT COALESCE(NULL, NULL, '대체값') FROM DUAL;
8. 성능 및 주의사항
- NVL 함수 사용 시 데이터 타입 일치에 주의 (예: 숫자형과 문자열 혼용 금지)
- 인덱스를 사용하는 WHERE 절에서 NVL 사용 시 성능 저하 우려
- 대용량 쿼리에서는
CASE WHEN이 더 유리한 경우 있음
9. 결론
NVL 함수는 Oracle SQL에서 NULL 처리의 기본이 되는 함수입니다. 단순하면서도 다양한 실무 상황에서 유용하게 활용되며, 다른 유사 함수들과 함께 적절히 사용하면 보다 탄탄한 데이터 품질과 오류 없는 보고서를 만들 수 있습니다. 특히 실무에서는 성능을 고려해 CASE 문, COALESCE 함수와 병행 사용하는 전략이 추천됩니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/
- Oracle SQL Language Reference (NVL Functions)
- 실무 예제 기반 작성 및 테이블 스키마 단순화
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] COALESCE() 함수로 복잡한 CASE 문 없이 NULL 처리하기 (0) | 2025.06.07 |
|---|---|
| [ORACLE] NULLIF() 함수 완전 정복 : 두 값 비교로 NULL 반환하는 방식 (0) | 2025.06.07 |
| [ORACLE] NVL2() 함수로 NULL 유무에 따른 조건 처리 쉽게 구현하기 (0) | 2025.06.07 |
| [ORACLE] ROWIDTOCHAR()로 ROWID를 문자형으로 변환하는 방법 (0) | 2025.06.07 |
| [ORACLE] CHARTOROWID() 함수 완벽 가이드 : 문자형 ROWID를 ROWID로 변환 (0) | 2025.06.06 |