Oracle SQLD

nvl, nvl2, decode, case ~ when ~ then

chna 2022. 6. 3. 13:47

nvl(column, 대체값)
  - column이 null이면 대체값 적용
  - column이 null이 아니면, column의 원래 값이 나옵니다.
nvl2 (column, 대체값1, 대체값2) 
  - 대체값이 같은 데이터 타입이여야한다. 앞의 대체값의 데이터타입을 따른다. (자동 형변환 됨)
  - column이 null이면 대체값2 적용
  - column이 null이 아니면, 대체값 1 적용
주의* 대체값은 column의 datat type과 같아야한다.
 예시)
 select ename, job, sal, comm from emp;
 select ename, job, sal, nvl(comm, 0) from emp;
 --select ename, job, sal, nvl(comm, sysdate) from emp; --error 같은 데이터 타입이여야한다.
 --select ename, job, sal, nvl(comm, '없음') from emp;--error 같은 데이터 타입이여야한다.
 select ename, job, sal, nvl2(comm, comm * 12, 0) from emp;
 select ename, job, nvl2(job, '직업있음', '직업 없음') from emp;
 select ename, hiredate, nvl2(hiredate, hiredate, sysdate) from emp;

decode : 자바의 if ~ else if  ~ else 문과 비슷
 예시)
 select deptno, decode(deptno, 10, '회계') from emp; -- if문
 select deptno, decode(deptno, 10, '회계', 'else') from emp; -- if ~ else문
 select deptno, decode(deptno, 10, '회계', 20, '기획', 'else') from emp; -- if ~ else if ~ else문
 select deptno, decode(deptno, 10, '회계', 20, '기획', 30, '영업', 'else') from emp; -- if ~ else if ~ else문

case ~ when ~ then ~ else : 자바의 switch ~ case ~ default 문과 비슷
 예시)
 select deptno from emp;
 select deptno 
             , case 
                 when deptno = 10 then '회계'
                 when deptno = 20 then '기획'
                 when deptno = 30 then '영업'
                 else '기타'
             end
  from emp;
 예제)
 emp의 모든 데이터를 출력하는데
 급여를 CLERK와 ANALYST는 5%
 SALESMAN과 MANAGER는 10% 올려서 출력
 예제의 답)
 select emp.*,
 case when job = 'CLERK' then sal * 0.05 + sal
 when job = 'ANALYST' then sal * 0.05 + sal
 when job = 'SALESMAN' then sal * 0.1 + sal
 when job = 'MANAGER' then (sal * 0.1) + sal
 else sal
 end as "SAL"
 from emp;