프로그래밍/SELECT

NVL(SUM(A), 0) vs SUM(NVL(A, 0)) 차이 쉽게 정리

오텍 2025. 4. 3. 06:00

📖 목차

    반응형

    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(...))가 더 안전하고 실무에 적합함
    반응형