DB/그 외

[Oracle] SUM()함수에서 NULL값의 처리

HMHA 2023. 3. 22. 15:21
300x250
반응형
300x250

SUM()함수에서 NULL값의 처리

 

 

컬럼값이 NULL인 경우 사칙연산을 할 경우 결과값은 모두 NULL이 되게 된다. 이런 결과로,

SUM()함수에서 NULL값의 공포로 인해 우리가 함부로 NVL()함수를 사용하면 비효율이 발생한다.

 

예를 들어 아래의 경우를 살펴보자.

 

SUM(NVL(COL1,0))

 

 

여기서 COL1 컬럼은 SUM()함수에 의하여 연산이 된다. 연산중 NULL값이 있어 전체 결과가 NULL값이 될까 두려워 이렇게 사용했다면 이것은 잘못된 생각이다.

SUM()함수에서 단일 컬럼이 연산이 될 때에는 NULL값은 연산의 대상에서 제외된다. NULL값이 연산을 하지 않았으므로 결과는 절대 NULL값이 되지 않는다.

위 처럼 NVL()함수를 사용하여 NULL값을 가진 경우 '0'으로 바꾸어도 결과는 동일하다. 그러니 SUM()함수 내에 NVL()를 쓰는 것은 불필요한 연산만 증가시키는 것이다.

'0'을 더하는 것도 연산이기 때문이다. 예를 들어 SUM()함수를 이용할 Row가 10만이고 그중 NULL값을 가진 경우가 9만이라고 한다면 불필요한 연산을 9만번이나 더 수행하는 것이 된다.

 

사실 이와 같은 잘못을 저지르는 이유는 NULL값의 연산에 대한 무지보다는 최종으로 추출되는 결과가 NULL값인 겨우에 화면에 공백이 추출되어 보이므로 이를 '0'으로 채우고 싶어서 그렇게 한 경우일 것이다.

그렇다면 이런 경우는 아래와 같이 하여야 한다.

 

NVL(SUM(COL1),0)

 

 

바로 위 문장은 앞선 위의 경우와 큰 차이가 없어 보이지만 처리할 일의 양에는 큰 차이가 난다.

조금전에 가정했듯이 Row 10만 건이 있다가 했을 때 전체 값이 NULL인 경우에 앞선 예는 10만 번이나 '0'을 더하는 연산을 하여 '0'을 출력하지만 바로 위의 예는 한번도 연산을 하지 않고 '0'을 출력하게 된다.

 

 

이번에는 두 컬럼의 연산이 있는 경우를 살펴보도록 하겠다.

예를 들어 아래와 같이 데이터가 들어 있다고 했을 경우 어떤 결과가 나오는지 확인해 보자.

ROW COL1 COL2
1 NULL NULL
2 1 NULL
3 1 1

 

 

* 실행과 결과

SELECT SUM(COL1), SUM(COL1+NULL), SUM(COL1+COL2) FROM 테이블명
---------------------------------------------------------------------------
2 NULL 2

 

 

위 결과를 보면 SUM(COL1)은 맨 처음 설명했던 대로 결과가 나와 문제가 없다.

그런데 SUM(COL1+COL2)은 "3"이 나올 줄 알았는데 "2"만 나왔다.

SUM 함수가 제공해주는 편의는 어떻게 보면 제공 해 주다가 만 듯한 결과를 보인다.
이 함수가 동일한 컬럼 내의 NULL연산은 처리해 주지만 컬럼별 연산은 처리를 못한다.

다시 말해, 1ROW와 2ROW에는 각 컬럼에 NULL을 포함하고 있기 때문에 NULL처리되고, 실질적으로 3ROW만 정상적으로 처리하게 된다.

따라서, SUM안에서 컬럼별 연산을 할 때에는 NULL을 유발할 수 있는 것들을 반드시 제거해야 한다.

 

이런 경우는 아래와 같이 처리하면 되겠다.

 

NVL(SUM(COL1),0)+ NVL(SUM(COL2),0)

 

[오라클] SQL - SUM()함수에서 NULL값의 처리

 


 

출처 : 짜근 일상 Story :: SUM()함수에서 NULL값의 처리 (tistory.com)

 

SUM()함수에서 NULL값의 처리

SUM()함수에서 NULL값의 처리 컬럼값이 NULL인 경우 사칙연산을 할 경우 결과값은 모두 NULL이 되게 된다. 이런 결과로, SUM()함수에서 NULL값의 공포로 인해 우리가 함부로 NVL()함수를 사용하면 비효휼

zzagun.tistory.com

 

300x250
반응형