SQL case when 구문과 활용방안(순서 치환), comment 달기

2024. 9. 14. 15:22SQL

case when

case when은 기존 테이터 테이블에서 원하는 데이터를 원하는 특정값으로 분기처리해서 출력할 수 있는 구문이다.
case when의 경우 단순case when 표현식과 검색 case when표현식으로 작성한다.
 
 

단순 case when 표현식

--실습테이블 불러오기--
select * from emp1;

--단순 case 표현식--
select ename, empno, sal, deptno,
case deptno
when 10 then '개발부'
when 20 then '영업부'
when 30 then '마케팅부'
when 40 then '기획부'
else '해당없음' end as denam
from emp1;
<기존 테이블> <case when적용>

 
단순case구문에서는 case옆에 분기처리할 해당 컬럼을 적고 when값에는 해당컬럼의 해당값, then에는 분기처리시 출력될 값을 적는다. 즉  case (해당컬럼이) when (A라면) then (B를 보여줘) else (when값에 없는 데이터는 여기 적힌값으로 보여주고)
end as (분기처리된 데이터들의 컬럼이름은 여기 적힌걸로 보여줘)
하고 명령을 내리는것이라고 생각하면 된다..!!
 
 
 

검색 case when표현식

--검색 case 표현식--
select ename, empno, sal, deptno,
case when sal >=500 then 'VVIP'
     when sal >=300 then 'VIP'
     else '보통' end as 등급
     from emp1;

 
이번에는 검색case when구문을 사용하여 급여별 등급으로 분기처리를 해보았다. 검색과 단순의 표현은 비슷해보이지만 검색의 경우 when절에 사용할 컬럼을 같이 적어 사용한다. 마찬가지로 sal이 500이상이면 VVIP를, 300이상이면 VIP를 그외에는 보통을 보여달라는 구문이다.
 
 
 

단순 case when 표현식과 검색 case when표현식의 차이점

단순case의 경우 무조건 이퀄 조건만 사용가능하다. 무조건 A라면 B로 성립하는 1대1 대응관계만을 표현할 수 있다면,
검색case의 경우 위에서 사용된 구문처럼 500이상, 300이상 처럼 범위를 포함할 수 도 있으며, =이퀄 조건뿐만 아니라 non이퀄조건도 가능하다.
 
 
 

case 실습 및 활용

--실습--
--날짜별로 신규사원과 기존사원 나누기--
select * from emp1;

--날짜추가하기--
alter table emp1 add hiredate number ;
update emp1 set hiredate=20200512 where empno=100;
update emp1 set hiredate=20220421 where empno=101;
update emp1 set hiredate=20220421 where empno=103;
update emp1 set hiredate=20231214 where empno=104;
update emp1 set hiredate=20240321 where empno=105;

--날짜별로 신규사원과 기존사원 나누기--
select empno, ename, sal, deptno, hiredate,
case when hiredate >=20240000 then '신규사원'
     when hiredate >=20210000 then '중간사원'
     when hiredate >=20200000 then '기존사원'
     else '해당없음' end as 입사년도_등급 
     from emp1;

실습을 위해 기존 테이블에 입사 날짜를 추가했다.

그 후 입사데이터를 가지고 년도별로 분기처리를 한 결과이다.

2024년도 이후에 입사했다면 신규사원으로, 2021년도 이후에 입사한 사원은 중간사원으로, 2020년도 이후에 입사한 사원은 기존사원으로 출력했으며, 만약 해당 컬럼에 이 3가지에 모두 포함되지 않는 다면 해당없음으로 출력하도록 했다.
 
 
 

case when으로 order by활용하기!

--순서 출력--
select * from emp
order by sal;

--case when구문을 사용하여 원하는 행만 순서를 조정할 수 있음--
select * from emp
order by case when sal=5000 then 0 else sal end; 

select * from emp
order by case when empno = 7369 then 10000 else empno end desc;

order by를 출력하는 경우, 입력하는 옵션에 따라 보통은 기본 오름차순 또는 내림차순으로 출력된다. 만약 전체 행을 특정 컬럼에따라 오름차순으로 출력해야하는데 특정 행 하나만 오름차순에 상관없이 가장 맨위에 출력해야하는경우에는 case when구문을 사용하여 해당 값을 치환 후 출력해줄 수 있다.
 

기본출력(오름차순)
select * from emp order by case when sal=5000 then 0 else sal end;

이처럼 order by구문에 case when구문을 사용하여, 만약 sal이 5000이라면 숫자 0으로 치환하고, 그외에는 그냥 기본 sal값으로 출력해달라는 의미이다. order by의 오름차순은 가장 작은 수 부터 출력하는데, 가장 큰 수인 5000을 0으로 치환하였기때문에 오름차순이지만 가장 큰 급여를 가진 직원의 정보가 첫번째로 출력되고 그 다음부터 오름차순으로 출력되도록 한것이다. 
 

select * from emp order by case when empno = 7369 then 10000 else empno end desc;

이 경우도 마찬가지로 직원번호가 가장 큰 순서대로 출력되도록 내림차순 하고 있지만 case when구문을 사용하여 가장 직원번호가 가장 작은 직원의 정보를 첫번째에 출력되도록 했다.
 


 

comment

오라클에서는 테이블을 생성할때 코멘트라는것을 작성할 수 있다. 코멘트를 작성하는것은 필수는 아니지만, 실무에서 다른 동료들과 함께 작업하는 경우나 다른 팀에 데이터를 공유하는 경우 처럼 내가 생성한 테이블과 코드를 더 쉽게 이해하고 유지보수 시, 참고용으로 작성한다. 이런 코멘트를 통해서 코드의 의도나 해당컬럼 생성이유 등을 한눈에 파악하기 쉽도록 한다.

--comment--
comment on table emp1 is '직원정보';
comment on column emp1.empno is '직원번호';
comment on column emp1.ename is '직원이름' ;
comment on column emp1.sal is '직원급여';
comment on column emp1.deptno is '부서번호';
comment on column emp1.hiredate is '입사정보';

--코멘트 조회--
select * from all_col_comments where table_name ='emp1';

테이블을 생성한 후, comment on table 테이블 명 is '테이블 설명'의 형식으로 테이블의 명을 따로 정의 할 수 있으며
해당 컬럼은 comment on column 테이블명.컬럼명 is '컬럼 설명'의 형식으로 적는다. 이렇게 적은 코멘트는
select * from all_col_comments where table_name = '테이블명'의 형식으로 조회할 수있다.

위 처럼 구문을 통해 코멘트를 적는 방식도 있으나, 실무에서는 테이블 편집창을 이용하여 바로 적고 확인하는 경우도 있다.
 


 

학습일기

 case when은 단순 치환이 아니라 order by절에  사용하여 순서를 출력할때 옵션을 줄수있다는게 가장신기했다.
sql은 이런경우처럼 원래 주로 사용되는 방법말고 다른 구문들과 같이 사용되면서 새로운 방식으로 사용되는경우가 정말 많은데, 다른 구문과 합쳐지면서 쿼리문이 약간 복잡해지는 듯한 느낌을 받을때가있다. 하지만 본래 쿼리문의 사용법에서 크게 달라지지는 않기때문에 기본 쿼리문의 사용법을 제대로알고있어야한다.
기초복습 탄탄하게..!