DB/Oracle

[SQL/Oracle] 쿼리 조건문 - case

jimkwon 2022. 5. 17. 13:10
반응형

 

 CASE 

 

쿼리문을 작성하다 보면 if - else 절과 같은 제어문 형식이 필요할 때가 있다.

그럴때 사용하는 함수가 CASE이다.

 

제어문에 쓰이는 switch-case문이 연상되는 녀석이군.. 뼈대를 살펴보자.

 

case 조건 
	When 결과1 then 출력1
    	When 결과2 then 출력2
    	ELSE 출력3
end "컬럼명"

if문 - when절

실행문 - then

else문 - ELSE

짝지어 구분하면 이해하기 편할 것이다.

필자는 조건절이 필요한 쿼리문을 짤 때 실제로 간단한 제어문을 써본 후 구현하기도 한다.

 

Student 테이블에서 tel 컬럼을 지번에 따라 해당 지역을 출력하려고 한다.

switch (지번) {
	case '02' : '서울' break;
    case '031' : '경기' break;
    ...
    case '055' : '경남' break;
    default '기타'
}

Java로 본다면 위와 같은 코드일 것이다.

쿼리문으로 짜보자

 

select name, tel, case(substr(tel, 1, instr(tel,')')-1)) 
                    when '02' then '서울'
                    when '031' then '경기'
                    when '032' then '인천'
                    when '051' then '부산'
                    when '052' then '울산'
                    when '055' then '경남'
                    else '기타'
                end "LOC"
from student
where deptno1=201;

간단히 풀어보면

case(tel에서 뽑아낸 지번) 에서 02, 031....055 등 지역번호를 구분하는 작업을 한다.

구분된 값은 end에서 설정한 "LOC"컬럼에 차례대로 실행된 값이 나온다.

 

substr(컬럼, 자를위치, 길이) -> 위치부터 길이만큼 잘라진 문자열 반환
instr(컬럼, 찾을 문자) -> 위치 반환
(여기서 다루는 주된 내용은 아니지만 첨부한다.)

 

결과는 다음과 같다.

 

 

앞의 지번 02, 053.. 등을 잘라서 지번에 맞는 지역을 출력했다.

마지막 end에 들어가는 값은 LOC과 같은 컬럼을 설정하는 값이다.

 

 

 

 

물론 모든 값을 가져와서 java등 각자 언어에서 파싱하는 방법도 있겠지만, 속도면에서 본다면 당연히 DB단에서 처리하는 것이 빠르다. 알아두면 좋을것 같아 정리해본다 :)