DataBase/Oracle

[Oracle Database] NVL함수 사용 중 유의점

mongyang 2013. 2. 13. 14:03

오라클에 대상의 값이 존재하지 않을 경우 다른 값으로 치환해 주는 함수가 있다. NVL 함수인데...

얼마전 우연히 이 함수를 사용하면서 난관에 봉착한 적이 있었다.

 

 select NVL(대상컬럼, 0) into 받을 변수 from 테이블 where 조건 = 전달 받은 조건;

 

 이 구문을 사용하면서 기대했던 값은. 대상 컬럼의 값이 존재하지 않는다면 변수에 값이 0이 

들어가길 희망했다. 

 하지만 변수에 값이 세팅되지 않고 예외상황이 발생했고, 한참을 끙끙거렸더랬다.

 

 이유는 간단했다. 이미 이 글을 보는 누군가는 저 구문에서 한가지가 빠져 있다는 것을 눈치챈 

분들도 있을 것이다. 

 

 위의 구문을 실행했들때, 조건에 맞는게 없다면 NVL에서 대상을 변경 시키지 못한다.

해서 NVL(MAX(컬럼명)), 0) 혹은 NVL(MIN(컬럼명), 0) 으로 해주어야 한다.

MAX()나 MIN()함수는 임시로 컬럼을 생성하고 임시로 생성된 컬럼에 값이 없다면 NVL은 대상이 

존재하기 때문에 주어진 값(위에서는 0)으로 변경이 가능해 진다. 

 

그래서

 

 select NVL(MAX(대상컬럼), 0) into 받을 변수 from 테이블 where 조건 = 전달 받은 조건;

 

이렇게 사용하면 되겠다.