nvl, nvl2, decode, case ~ when ~ then
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;