📖 목차
반응형
NVL(SUM(...))과 SUM(NVL(...))의 차이를 예제와 함께 쉽게 설명합니다. COALESCE와 NVL 함수의 차이도 비교하며, SQL에서 NULL 값을 안전하게 처리하는 방법을 배울 수 있습니다.
금액 데이터를 합산할 때 NULL이 섞여 있으면 SUM() 함수 결과에 영향을 줄 수 있습니다. 이럴 때 NVL()을 함께 쓰면 안전하게 0으로 처리할 수 있는데, 어디에 쓰느냐(NVL을 바깥에? 안에?)에 따라 결과가 달라질 수 있습니다.
1. 두 함수 차이 요약
구문 | 의미 |
NVL(SUM(A),0) | 합계가 NULL일 경우 전체를 0으로 바꿈 |
SUM(NVL(A,0)) | 각 값이 NULL일 경우 0으로 바꾸고 더함 |
2. 예제로 비교해 보기
예제 테이블 : PAYMENYS
ID | AMOUNT |
1 | 100 |
2 | NULL |
3 | 200 |
NVL(SUM(A),0)
SELECT NVL(SUM(AMOUNT), 0) FROM PAYMENTS;
-- 결과: 300
- SUM(AMOUNT)는 NULL을 무시하고 100 + 200 = 300
- 이 결과는 NULL이 아니므로 NVL()은 적용되지 않음
SUM(NVL(A,0))
SELECT SUM(NVL(AMOUNT, 0)) FROM PAYMENTS;
-- 결과: 300
- amount의 NULL을 먼저 0으로 바꿈 → [100, 0, 200]
- 100 + 0 + 200 = 300
결과는 같음
3. 그런데 언제 달라질 수 있나요?
모든 값이 NULL일 때 두 방식의 의미가 실제로 달라질 수 있습니다. 보통은 결과가 같아 보이지만 이럴 때는 개념적으로 큰 차이가 있습니다.
예제 테이블: PAYMENTS_NULL_ONLY
ID | AMOUNT |
1 | NULL |
2 | NULL |
NVL(SUM(AMOUNT), 0)
SELECT NVL(SUM(AMOUNT), 0) FROM PAYMENTS_NULL_ONLY;
-- 결과: 0
- 먼저 SUM(AMOUNT)를 계산합니다.
- 모든 값이 NULL이기 때문에 SUM() 결과도 NULL이 됩니다.
- 그런 다음 NVL(..., 0)으로 NULL을 0으로 바꿉니다.
SUM(NVL(AMOUNT, 0))
SELECT SUM(NVL(AMOUNT, 0)) FROM PAYMENTS_NULL_ONLY;
-- 결과: 0
- 먼저 NVL(AMOUNT, 0)로 각 행의 NULL을 0으로 바꿉니다.
- 변환된 값은 [0, 0]이므로 SUM() 결과는 0 + 0 = 0이 됩니다.
차이는 무엇인가요?
결과는 같지만, SUM(NVL(...))는 각 행의 NULL을 명시적으로 처리하기 때문에 더 안전하고 명확한 방식입니다.
구문 | 처리 순서 |
NVL(SUM(...), 0) | 전체 합계를 낸 후, 그 결과가 NULL일 때만 0으로 바꿈 |
SUM(NVL(...)) | 개별 NULL 값을 0으로 먼저 바꾸고, 그 뒤에 합산 |
4. 결론
- NULL 값 일부 포함 → 둘 다 동일한 결과
- 모든 값이 NULL인 경우 → 둘 다 0으로 결과 반환됨
- 일반적으로 권장 방식 →SUM(NVL(...))가 더 안전하고 실무에 적합함
반응형
'프로그래밍 > SELECT' 카테고리의 다른 글
SQL 실행 속도를 10배 줄이는 쿼리 튜닝 체크리스트 (0) | 2025.04.08 |
---|---|
오라클 COALESCE와 NVL – 널값 처리의 차이점 (0) | 2025.04.01 |
오라클 MERGE INTO – 한 번에 추가하고 수정하는 SQL 문 (0) | 2025.03.27 |
INSERT문에서 SELECT 사용하는 방법 (0) | 2025.03.25 |