본문 바로가기
수업(국비지원)/Oracle

[Oracle] SQL 단일행 함수 - 일반 함수 nvl(), decode(), case 구문

by byeolsub 2023. 4. 14.

1) nvl() : null값을 다른 값으로 변환해주는 함수.

nvl(컬럼,치환할 값)
nvl(bonus,0) : bonus 컬럼의 값이 null인 경우는 0으로 변환. 
               null이 아니면 bonus값.

예시 : 교수의 이름, 연봉(급여*12+보너스) 출력하기
select name, pay*12+nvl(bonus,0) 연봉 from professor;

문제 : 
 1. 학생의 이름과 지도교수번호(profno)출력하기.
 단 지도교수가 없는 학생의 지도교수번호는 9999로 출력하기.
select name,nvl(profno,9999) profno from student;
문제 : 
 2. 부서테이블(department)에서 부서코드(deptno)와 부서명(dname),건물명(build) 출력하기
  단 건물명이 없는 학과는 건물없음으로 출력하기.
select deptno,dname,nvl(build,'건물없음') build from department;
문제 : 
 3. 교수의 이름,급여,보너스,성과급 출력하기
 단 성과급 : 보너스가 있는 경우 보너스*3
           보너스가 없는 경우 0
select name,pay,bonus,nvl(bonus*3,50) 성과급 from professor;

2) decode() : 조건 함수

decode(컬럼명,값,참,거짓)
예시 : 
 1. 교수테이블에서 교수이름,학과번호,학과명 출력하기
 학과명이 101인 경우,'컴퓨터공학'으로 그외는 공란으로 출력하기
select name,deptno,decode(deptno,101,'컴퓨터공학','') from professor;
예시 : 
 2. 교수테이블에서 교수이름,학과번호,학과명 출력하기
 학과명이 101인 경우,'컴퓨터공학'으로 그외는 '기타학과'로 출력하기
select name,deptno,decode(deptno,101,'컴퓨터공학','기타학과') from professor;
예시 : 
 3. 교수테이블에서 교수이름,학과번호,학과명 출력하기
 학과명이 101인 경우,'컴퓨터공학',102인 경우는 '멀티미디어공학',
 201인 경우는 '기계공학' 그외는 '기타학과'로 출력하기
select name,deptno,decode(deptno,101,'컴퓨터공학',102,'멀티미디어공학',
 201,'기계공학','기타학과') from professor;

문제 : 
 1. 학생의 주민번호 7번째 자리가 1,3인 경우는 남자,2,4인 경우는 여자로 출력하기
 학생의 이름, 주민번호, 성별 조회하기
select name,jumin,decode(substr(jumin,7,1),'1','남자','3','남자',
'2','여자','4','여자','성별오류') 성별 from student
문제 : 
 2. 학생의 이름,전화번호,지역명 출력하기
지역명 : 전화번호의 지역구분이 02:서울,051:부산,052:울산 그 외에는 기타로 출력함
select name,tel,decode(substr(tel,1,instr(tel,')')-1),'02','서울','051','부산',
'052','울산','기타') 지역명 from student

3) case 구문 : 조건문. decode 함수와 같은 기능. 범위 지정가능. 

case 조건 when 결과1 then 출력1
[when 결과2 then 출력2]
else 출력3
end “컬럼명”
예시 :
 1. 학생의 주민번호 7번째 자리가 1,3인 경우는 남자,2,4인 경우는 여자로 출력하기
 학생의 이름, 주민번호, 성별 조회하기
select name,jumin, case substr(jumin,7,1) when '1' then '남자' when '2' then '여자'
 when '3' then '여자' when '4' then '여자' end 성별 from student
select name,jumin, case when substr(jumin,7,1) in (1,3) then '남자' 
 when substr(jumin,7,1) in(2,4) then '여자' end 성별 from student
예시 :
 2. 학생의 이름,전화번호,지역명 출력하기
지역명 : 전화번호의 지역구분이 02:서울,051:부산,052:울산 그 외에는 기타로 출력함. 
case 구문으로 구현
select name,tel, case substr(tel,1,instr(tel,')')-1) when '02' then '서울'
 when '051' then '부산' when '052' then '울산' else '기타'end 지역명 from student

// 반드시 end로 끝나야 한다. 

문제 : 
 1. 학생의 생일이 1~3월인 경우 1분기, 4~6월인 경우 2분기, 7~9월이 경우 3분기,10~12월인 경우 4분기 출생분기라 한다.
 학생의 이름, 주민번호, 출생분기를 출력하기. 단 생일은 주민번호 기준으로 한다.
select name, jumin, case when substr(jumin,3,2) in(1,2,3) then '1분기'
 when substr(jumin,3,2) in(4,5,6) then '2분기' 
 when substr(jumin,3,2) in (7,8,9) then '3분기' 
 when substr(jumin,3,2) in (10,11,12) then '4분기'end 출생분기1,
case when substr(jumin,3,2)  between '01' and '03' then '1분기' 
when substr(jumin,3,2) between '04' and '06' then '2분기' 
when substr(jumin,3,2)between '07' and '09' then '3분기' 
when substr(jumin,3,2) between '10' and '12' then '4분기'end 출생분기2 from student
문제 : 
 2. 학생의 생일이 1~3월인 경우 1분기, 4~6월인 경우 2분기, 7~9월이 경우 3분기,10~12월인 경우 4분기 출생분기라 한다.
 학생의 이름, birthday, 출생분기를 출력하기. 단 birthday 출력시 'yyyy-mm-dd'형태로 출력하기
select name,to_char(birthday,'yyyy-mm-dd'),
case when to_char(birthday,'mm') between '01' and '03' then '1분기'
when to_char(birthday,'mm') between '04' and '06' then '2분기' 
when to_char(birthday,'mm') between '07' and '09' then '3분기'
when to_char(birthday,'mm') between '10' and '12' then '4분기' end 출생분기 from student