개발 등/ORACLE

nvl() 함수

darkhorizon 2008. 8. 5. 18:34
728x90
반응형

NVL 함수는 NULL 값을 다른 값으로 대치시킬 때 쓰인다.


NVL( expr1, expr2 ) .


만약 1의 값이 NULL 이라면 2의 값을 반환하고, 1이 NULL이 아니면 그냥 1의 값을 반환한다.

모든 종류의 데이터 타입을 가질 수 있다.

NVL 함수는 이 두 개의 연산자를 비교하기 때문에 만약 1이 2와 다른 종류의 데이터 타입을

가지고 있다면, 오라클은 2의 데이터 타입을 1의 데이터 타입으로 변환한다.

함수의 반환값은 1의 데이터 타입과 동일하다.


실제 사용하고 있는 방식은

자바 클래스를 이용하여 반환되는 DB값이 NULL일 경우, "" 로 치환해서 쓰고 있다.

쿼리문에 NVL 함수를 사용하여 변환해도 되지만, 굳이 일일이 넣어서 쿼리를 지저분하게

만들지 않고 있다. 일단 기능상, 효율상 큰 차이가 없다고 본다.


NVL함수가 쓰이는 곳은 대부분 NULL로 반환되는 경우 다른 데이터로 변환해서 사용해야

할 경우에 쓰인다.





NVL2라는 함수 DECODE랑 조금 비슷한 놈


NVL2(expr,expr1,expr2);


expr의 값이 null이 아닐 경우에는  expr1의 값을 반환 하고요 null일 경우에는 expr2의 값을 반환 합니다.


예제)

-- 보통 SQL문을 실행 했을 경우
SQL>  SELECT ename, comm FROM emp;

ENAME                      COMM
---------------- ----------
SMITH              
ALLEN                        300
WARD                         500
JONES              
MARTIN                     1400
BLAKE               
CLARK               
SCOTT              
KING                
TURNER                        0
ADAMS            


-- NVL함수를 사용 했을 경우

NVL(expr1,expr2);

expr1 : NULL을 포함할 수 있는 값이나 표현식

expr2 : NULL 대신 사용할 값


expr1이 NULL이면 expr2를 출력하고 NULL이 아니라면 expr1을 출력.

그러나 테이블에 아무 데이타가 없으면 NVL(expr1,expr2)은 널이 됨.


SQL>SELECT ename, NVL(comm, 0) comm  FROM emp;

ENAME                      COMM
---------------- ----------
SMITH                           0
ALLEN                        300
WARD                         500
JONES                           0
MARTIN                     1400
BLAKE                           0
CLARK                           0
SCOTT                           0
KING                              0
TURNER                         0
ADAMS                          0


-- NVL2함수를 사용 했을 경우

SQL>SELECT ename, NVL2(comm, 1, 0) FROM emp;


ENAME                      COMM
--------------- ----------
SMITH                          0
ALLEN                          1
WARD                           1
JONES                          0
MARTIN                        1
BLAKE                          0
CLARK                          0
SCOTT                          0
KING                             0
TURNER                        1
ADAMS                         0



출처 : http://link.allblog.net/9870470/http://deadlock.tistory.com/entry/NVL-expr1-expr2-NVL2expr-expr1-expr2

728x90