본문 바로가기
✨ DBMS/Oracle

[Oracle / SQL] 많이 쓰는 함수 NVL , NVL2 , DECODE , CASE

by 환풍 2023. 2. 26.
728x90

NVL 함수 : NULL 값을 원하는 값으로 조회

NVL( 값 혹은 컬럼, 치환 값)

NVL

1
2
SELECT EMPNO, ENAME, COMM, NVL(COMM, 0)
FROM EMP;
cs

위에서 NVL은 COMM의 NULL 값을 0으로 바꿔주세요. 이다

 

1
2
SELECT EMPNO, ENAME, COMM, NVL(COMM, '인센티브없음')
FROM EMP;
cs

위 쿼리는 자료형이 일치하지 않아서 실행안된다. COMM은 숫자형이니 문자열과 일치하지 않다.


 

 NVL2(값 혹은 컬럼, NULL이 아닐때 값, NULL일 때 치환 값)

NVL2

1
2
3
4
SELECT COMM 
    , NVL(COMM, 0)
    , NVL2(COMM, 10000 )
FROM EMP;
cs

NVL2을 말하자면, COMM이 널이 아니면 1000, 널이면 0이라는 말이다.

 

1
2
3
4
5
SELECT COMM 
    , NVL(COMM, 0)
    , NVL2(COMM, 10000 )
    , NVL2(COMM,'널이 아님''널임')
FROM EMP;
cs

NVL2는 자료형이 불일치하더라도 NVL과 다르게 조회가 가능하다.


DECODE( ) 함수 -> 자바의 IF, ELSE IF, ELSE 

 

1
2
3
4
5
SELECT DEPTNO
    , DECODE(DEPTNO, 10'인사부'-- 부서번호가 10이면 인사부 나머지는 NULL
    , DECODE(DEPTNO, 10'인사부''개발부'-- 부서번호가 10이면 인사부, 나머지는 개발 부
    , DECODE(DEPTNO, 10'인사부'20'개발부''영업부')  -- 부서번호가 10이면 인사부, 20은 개발부, 나머지는 영업부
FROM EMP;
cs

 


CASE 문

1
2
3
4
5
6
7
8
9
10
SELECT DEPTNO
    , CASE 
        WHEN DEPTNO = 10 THEN '인사부'
     WHEN DEPTNO = 20 THEN '개발부'
        ELSE '영업부' END AS 부서명1
    , CASE DEPTNO
        WHEN 10 THEN '인사부'
        WHEN 20 THEN '개발부'
        ELSE '영업부' END AS 부서명2
FROM EMP;   
cs

DECODE나 CASE를쓰면 엄청 길어지기 때문에 반드시 별칭을 써주자.
위 CASE 안에 있는 것은 모두 같은 의미이다. 편한걸로 사용하자.

NVL과 CASE, DECODE정도는 알아두자.

반응형

댓글