본문 바로가기

별걸다하는 IT/데이터베이스 Database

[디비 SQL 오라클] SQL에도 IF분기문이 있다? CASE WHEN THEN 문법 알아보기, CASE구문 사용법

반응형

[데이터베이스 SQL 완전 정복 목차]

안녕하세요 방문자님들~ 오늘도 찾아온 양햄찌 블로거 입니다.

SQL에서 분기문으로는 코딩에서 if와 switch와 같이, SQL에는 CASE WHEN, DECODE문 요렇게 있는데요, 어쨌든 세개 모두 분기처리하는 역할을 수행하고 있습니다. 

ICASE WHEN, DECODE 중 오늘은 CASE WHEN먼저 알아보려고 합니다. ㅎㅎ

CASE WHEN ~ 은 무엇인가

SQL에서도 조건문을 쓰고 싶을 수 있겠죠! if문이나 switch구문 처럼요 ㅎㅎ

 

A가 if 조건1을 충족할경우 결과1을 수행하고

else if 조건2를 충족할 경우 결과2를 수행하고

else if 조건3을 충족할 경우 결과3을 수행하고

else 그 외는 해당 로직을 타게끔!!

그런 분기문 역할을 해주는 것이 CASE WHEN THEN~ 구문입니다.

 

switch (A)

case 조건1: 결과1 break;

case 조건2: 결과2 break;

..

default 그외결과

요렇게 생각하셔도 똑같아요 ㅎㅎ 결론! 분기문 역할을 해준다!

조오금 키워드가 달라서 그렇지 비교해보면 해당 문법이 뭘 의미하는지 알겠죠?? 똑.같.아.요!

A가 "if 조건1 충족시 결과1 수행" 이 부분이  "WHEN 조건1 THEN 결과1"에 해당되는거죠 ㅎㅎ

다만 SQL에서는 시작시 CASE키워드를, 끝낼시 END키워드를 붙여줘야 합니다.

 

[WHERE절과 CASE WHEN~]

이렇게 조건 거는 것은 WHERE절로 하는게 아니였나요??

WHERE절은 테이블에서 특정 조건으로 결과를 걸러내는 거고, 그니까 100개의 행이 있다면 조건에 맞는걸 제외시켜서 50개만 대상테이블로 남긴다던가..! 

 

CASE WHEN은 WHERE로 거른 결과를 기준으로 우리가 확인하고자 하는 컬럼 값을 특정 조건에 따라 다르게 보일 필요가 있을 때 사용하는 거예요.

 

CASE WHEN 사용예시

자자, 저번에 다운받았던 EMPLOYEE 테이블을 기준으로 하겠습니다.

EMPLOYEE.csv
0.01MB

경영팀에서 실적을 분석해봤어요 그랬더니 이번에 개발자가 엄청나게 열일했네! 그런데 판매는 작년에 비해 떨어졌어요.

흠 동기부여를 위해 내년에 개발자들 연봉을 500씩 올려주는대신 SA_REP는 500 차감해야겠다 이럴 수 있겠죠

(물론 실제로 이렇게 일어나진 않겠지만,ㅎㅎ) 

SELECT e.EMPLOYEE_ID , e.JOB_ID , e.SALARY 기존연봉
		CASE JOB_ID 
		WHEN 'IT_PROG' THEN SALARY+500
		WHEN 'SA_REP' THEN SALARY-500
		ELSE SALARY 
		END AS 최종연봉
FROM EMPLOYEES e ;

고럼 요렇게 작성할 수 있습니다.

 

CASE JOB_ID                                만약 JOB_ID가

WHEN 'IT_PROG' THEN SALARY+500 ▶ 'IT_PROG'일 때 SALARY값에 500을 더해라.

WHEN 'SA_REP' THEN SALARY-500    'SA_REP'일 때 SALARY값에 500을 빼라.
ELSE SALARY                                ▶ 그 외에는 그냥 SALARY를 표시해라
END AS 최종연봉                          ▶끝, 이 결과를 최종연봉이라고 컬럼명을 붙여라

 

이해하기 쉽죠??

 

CASE WHEN 조건절에 연산자나 함수로 비교하기

결과 뿐만 아니라 조건에 연산자로 비교하거나 함수를 사용할 수 있습니다.

직군별 최소 연봉과 최대 연봉이 있을 때 범위를 3으로 나눠서 각 사원들의 연봉 분포를 위해 페이가 낮은 레벨, 평균레벨, 높은레벨 이렇게 나눠서 표시해보려고합니다.

요렇게 분류를 한 번 해보려해요.

SELECT e.EMPLOYEE_ID , e.JOB_ID , e.SALARY ,
	CASE 
		WHEN SALARY BETWEEN j.MIN_SALARY AND j.MIN_SALARY + (j.MAX_SALARY-j.MIN_SALARY)/3 
       		THEN 'LOW PAYED'
		WHEN SALARY BETWEEN j.MAX_SALARY -(j.MAX_SALARY-j.MIN_SALARY)/3 AND j.MAX_SALARY 
        	THEN 'HIGH PAYED'
		ELSE 'AVG PAYED'
	END AS "PAY LEVEL"
FROM EMPLOYEES e, JOBS j 
WHERE e.JOB_ID  = j.JOB_ID 
ORDER BY EMPLOYEE_ID ;

플러스 마이너스 나누기 등의 연산자와 범위조건절 BETWEEN을 사용해봤어요 ㅎㅎ

잘 나오는 것을 확인할 수 있습니다. 

 

이 전 ROLLUP 포스팅에서 소계를 제외하고 총합계만 출력하는 쿼리에서도 CASE구문을 사용했었는데요.

SELECT CASE 
	WHEN GROUPING(d.DEPARTMENT_NAME) = 1  THEN '합계 TOTAL' 
	WHEN d.DEPARTMENT_NAME  IS NULL THEN '부서가 없는' ELSE d.DEPARTMENT_name
	END 부서명, E.JOB_ID ,SUM(e.SALARY)
FROM EMPLOYEES e , DEPARTMENTS d 
WHERE e.DEPARTMENT_ID  = d.DEPARTMENT_ID (+)
GROUP BY ROLLUP(d.DEPARTMENT_NAME, E.JOB_ID)
HAVING GROUPING_ID (d.DEPARTMENT_NAME , e.JOB_ID ) != 1; 

요렇게 함수와 비교 등을 통해서 원하는 값으로 치환할 수 있습니다.

해당 쿼리는 소합계시 나오는 NULL과 값이 없어서 나오는 NULL과 구분하기 위해 CASE WHEN을 사용해 분기처리 해줬습니다.

 

GROUP BY ROLLUP에 대해 추가적인 공부를 진행해보고 싶으신 분은 아래 포스팅을 참고해주세요!

▼GROUP BY와 ROLLUP: jhnyang.tistory.com/354

 

[SQL] ROLLUP과 GROUP BY. 집계 통계에 사용되는 롤업 함수 사용법을 알아보자. 롤업 합계 필드명 NULL

[데이터베이스 SQL 완전정복 목차] 안녕하세요 양햄찌입니당 저번 포스팅에서 기본적인 그룹핑 조건절 GROUP BY와 having에 대해서 살펴보았는데 혹시 기억하시는지요~!? 그 때 마지막에 간단하게 ROL

jhnyang.tistory.com

UPDATE에서 CASE WHEN 사용해보기

조회(SELECT)할 때뿐만 아니라 수정(UPDATE)할 때에도 활용 가능하죠.

만약 데이터를 여러개 넣었는데 잘못넣었어! 그러면 잘못된 데이터인 'A'를 발견할 경우 'B'로 수정해라

이런식으로 작성 가능하겠죠.

또는 하나의 열을 추가로 만들었는데, 이 속성이 다른 B라는 속성을 참조해서 만든 신규 데이터일 때, CASE WHEN을 이용해서 일괄적으로 데이터를 채워넣어줄 수 있어요.

 

앞 사용예시에서, IT_PROG 연봉을 500올려주고 SA_REP 연봉을 500차감하는거에 대해서 비교했었죠.

고려결과 합당하다 생각되어서 기존연봉을 없애고 신규연봉으로 교체해준다고 합시다.

UPDATE EMPLOYEES 
SET SALARY  = CASE JOB_ID 
 WHEN 'IT_PROG' THEN SALARY + 500
 WHEN 'SA_REP' THEN SALARY - 500 
 END
WHERE JOB_ID IN ('IT_PROG', 'SA_REP');

요렇게 짜면 기존의 SALARY 값들이 우리의 의도대로 다 교체될거예요~

UPDATE 수행 후 SELECT로 결과를 조회해봤습니다 (우측 사진)

본래 좌측사진의 '기존연봉' 속성이 SALARY였는데, 

우측에서 동일 테이블 SALARY 조회시, 기존연봉이 아닌 최종연봉값으로 조회된 것을 확인할 수 있어요. (UPDATE가 제대로 수행된거죠)

 

UPDATE 외에 INSERT, DELETE 등등 여러구문에도 물론 활용할 수 있습니다 :)

 

오늘은 SQL에서 자주 사용되는 CASE 구문을 알아보고 몇가지 예시 쿼리를 작성해보았어요.

도움이 되셨으면 좋아요 감사합니다. 다음 포스팅에서 봐요 빠빠이~

반응형