날짜 : 2024-05-12

태그 : oracle SQL 조건함수 case 함수

메모

조건함수

먼저 . 조건함수는 그룹함수가아니라 SQL 함수에 속해있다. 저번시간에 그룹함수까지 끝내지 못했기때문에 포스팅제목은 너무신경쓰지 말기바란다.

조건함수는 간단하게 java 나 컴활공부하다보면 배우는 엑셀의 IF 문이나 Case 문과같이 조건에따라서 SQL 문장을 다르게 처리할수 있는 함수다.

SQL 에서는 그러한 함수가 두가지가 있는데

  • DECODE : 조건이반드시 일치하는경우에 사용하는함수(동등)
  • CASE : 조건이 반드시 일치하지않아도가능(동등’=‘,부등’><’)

예제

 
select empno , ename ,
 
case when sal >=0 and sal <=1000 then 'E'
 
when sal > 1000 and sal <=2000 then 'D'
 
when sal > 2000 and sal <=3000 then 'C'
 
when sal > 3000 and sal <=4000 then 'B'
 
when sal > 4000 and sal <=5000 then 'A'
 
end "등급"
 
from emp;
 
/*
case 함수의 부등비교는 case when 뒤에 컬럼이름이붙고 그뒤에 비교할내용 여러개라면 and 추가
 
그리고 마지막에 then '출력하고싶은내용' 마지막에 else '내용'을 적어서 앞서 모든조건이 부합하지
 
않을 때에 출력할 나머지 값을 설정한다, ( 반드시 설정하지않아도 됨)
 
마지막으로 end를 사용하여 case 함수의 끝을 알린다.
 
중간에 컴퓨터 튕겨서 이전까지한 조건함수.내용이 날아갔다... 코드는 중간중간 시간날때 저장해두자
*/
select empno , ename , sal ,job ,
 
decode(job, 'ANALYST' , sal*1.1,
 
'CLERK' , sal*1.2,
 
'MANAGER' sal*1.3,
 
'PRESIDENT' sal*1.4,
 
'SALESMAN' sal*1.5, SAL) "급여"
 
from emp;
--decode 함수는 조건이 반드시일치해야되는경우에 사용하는 함수고 기본문법은
 
DECODE ( 컬럼 , 비교값1 , 결과값1 ,
 
비교값2 , 결과값2 ,
 
... 비교값n , 결과값n
 
기본결과값(else라고생각하면됨) )
 
이지만 조건함수는 문법을보고 눈으로보는것 보다 직접 해 보는게 가장 이해가빠른듯하다.
 
 
--복습 예제
 
select empno,ename,hiredate
 
from emp
 
where to_char(hiredate,'MM')='12';
 
--고용일이 12월인 직원들의 컬럼들을 꺼내오는 내용
 

 
select empno,ename,
 
lpad(sal,10,'*') 급여
 
from emp;
 
--지난번 포스팅에서 배운 lpad의 활용
 

 
select empno , ename, to_char(hiredate,'YYYY-MM-DD') 입사일
 
from emp;
 
--지난번 포스팅의 to_char 활용
 

 
select empno,ename,comm,
 
case when comm is null then'일반사원'
 
else '영업사원'
 
end "사원종류"
 
from emp
 
order by 3 asc;
 
--case when뒤에 컬럼이오는것을 보아 동등이아니라 부등조건이라고 판단해야한다. is null은 특이하게도
 
--동등같지만 여기에선 동등으로 쓰이지않는다.
 

 
select empno,ename,comm,
 
case when comm is not null then'영업사원'
 
else '일반사원'
 
end 사원종류
 
from emp
 
order by 3 asc;
 
--is not null 을활용 .. 마찬가지로 중요한점은 is null 은 '=' 개념이아니라 case when 뒤에서 사용되어야한다. 주의!
 

 

 
select loc ,
 
case when loc='NEW YORK' then 'EAST'
 
when loc='DALLAS' and loc='CHICAGO' then 'CENTER'
 
when loc='BOSTON' then 'EAST'
 
end "AREA"
 
FROM dept;
 
--첫번째로 시도한 코드 .. 달라스랑 시카고가 null 값이 나왔다 ;; (틀린코드) loc는 location의 약자임
 
--지역마다 동서남북 센터를 표시하려는 코드이다.
 

 
select loc ,
 
case loc when 'NEW YORK' then 'EAST'
 
when 'DALLAS' then 'CENTER'
 
when 'CHICAGO' then 'CENTER'
 
when 'BOSTON' then 'EAST'
 
else 'ETC'
 
end "AREA"
 
FROM dept;
 
-- 올바른 작성법 .. case 함수가 동등으로 사용됬어야했다.
 
else 가 없어도 같은 결과가나온다.
 

 
select loc ,
 
decode(loc,'NEW YORK','EAST',
 
'DALLAS','CENTER',
 
'CHICAGO','CENTER',
 
'BOSTON','EAST',
 
'ETC') as "AREA"
 
from dept;
 
--같은결과를 decode 문을 사용하여 완성 , 둘다 동등의경우이다.
 

 

 
select loc , decode(loc, 'NEW YORK','EAST',
 
DECODE(LOC , 'CHICAGO','CENETR',
 
DECODE(LOC , 'DALLAS' , 'CENETER', 'ETC')))
 
AREA
 
FROM DEPT;
 
--decode를 조건안에 넣는 중복활용 처음 접하게되면 꽤 어렵다. 엑셀의 IF문 중첩이라고 생각하면조금이해가편하다.
 

 
select ename , sal ,
 
case when sal >=2000 then 1000
 
when sal >= 1000 then 500
 
when sal < 1000 then 0
 
end BONUS
 
from emp;
 
--case 문 연습
 

 
select empno, ename , sal ,
 
case when sal between 0 and 1000 then 'E'
 
when sal between 1001 and 2000 then 'D'
 
when sal between 2001 and 3000 then 'C'
 
when sal between 3001 and 4000 then 'B'
 
when sal between 4001 and 5000 then 'A'
 
end 등급
 
from emp
 
order by 4 desc;
 
--이렇게 between 을 사용 할 수도 있다.
 

 

 
select empno , ename ,
 
case when sal >=0 and sal <=1000 then 'E'
 
when sal > 1000 and sal <= 2000 then 'D'
 
when sal > 2000 and sal <= 3000 then 'C'
 
when sal > 3000 and sal <= 4000 then 'B'
 
when sal > 4000 and sal <= 5000 then 'A'
 
END "등급"
 
from emp;
 
-- and를 이용하여 조건을 작성
 

 
select empno , ename ,sal,
 
decode(sign(sal-4000),1,'A',
 
decode(sign(sal-3000),1,'B',
 
decode(sign(sal-2000),1,'C',
 
decode(sign (sal-1000),1,'D','E') ))) 등급
 
from emp
 
order by 4 asc;
 
--sal을 이용하여 부등식과 같은 효과를 낸 코드.
--여기부터 어려워진다.

생각 (질문)

출처 (문헌)

학원에서 준 바인딩 책임

연결 (이유)

참고문헌

에이콘아카데미 출판사