본문 바로가기
DataBase/MYSQL

[MYSQL] CASE 함수 - 조건을 걸어보자!

by 오늘은강박사갈거야~~ 2021. 9. 12.
반응형

- 이 글은 제가 공부를 하며, 이해한 것을 바탕으로 작성하는 글입니다.

- 그렇기에 틀리거나 잘못된 부분이 있을 수 있습니다.

- 글의 오류를 발견하시면, 댓글로 말씀해 주시면 정말 감사하겠습니다.


mysql의 query에서는 어떻게 여러 조건들을 할당하여 각각의 경우를 처리할 수 있을까? 그럴 때에는 CASE문을 이용한다. CASE 함수는 어떠한 조건에 부합하면 값을 리턴하고, 부합하지 않으면 다음 조건으로 간다.

 

기본적인 CASE 함수의 특징은 아래와 같다. 

 

1. WHEN과 THEN은 최소 한 쌍이 필요
2. WHEN~ THEN구문은 여러 개가 존재 가능
3. 모든 것에 부합하지 않는 경우에는 NULL값으로 출력. 
4. ELSE는 존재할 수 도 있고 안 할 수도 있음.
5. 만약 ELSE가 없는데, 모든 조건에서 참이 나오지 않는다면, NULL을 반환

 

CASE Function은 크게 2가지가 존재한다. 칼럼을 기준으로 case문을 사용하는 경우와 단순한 조건으로 사용하는 경우이다. 

 

1. 단순 조건으로 사용하는 CASE 정의

CASE 컬럼명
	WHEN 값 A 	THEN 값
	WHEN 값 B 	THEN 값
	ELSE 값 C(취사선택)
END
  • CASE 문 바로 뒤에 칼럼 이름을 쓰고, 그 칼럼의 값과 어떤 값이 같은지(=)를 비교하는 CASE 함수를 단순 CASE 함수라고 한다.
  • 단순 CASE에서는 등호 연산밖에 할 수 없다. 즉, 내가 설정한 값과 동일한 값이 존재할 때, 처리하는 방법뿐이다.

 

단순 조건 CASE문 예시

SELECT name,
CASE age
	WHEN 31 THEN '어른'
    WHEN 30 THEN '아키'
    ELSE age
END AS 연령대

FROM family_info;
  • 단순하게 age 칼럼의 값이 31이면 '어른'이 출력되고, age 칼럼의 값이 30이면 '아키'가 출력이 된다.

 

2. 컬럼을 기준으로 하는 CASE 정의

CASE
	WHEN 조건 A
	THEN 조건 A 가 부합하면 출력하는 값
	WHEN 조건 B 
	THEN 조건 B 가 부합하면 출력하는 값
	ELSE '위의 모든 WHEN 조건에 부합하지 않는 경우 출력하는 값 C'(취사선택)
END
  • 단순 CASE에서는 등호 연산밖에 할 수 없고 다르게, 내가 원하는 조건을 설정할 수 있다.
  • 대부분의 CASE문은 이 CASE문이다.

 

 

칼럼 기준 CASE 문 예시

SELECT name,
	   weight / pow(height,2) AS bmi
       
case
	when weight / pow(height,2) >= 25.0 THEN '과체중'
    when weight / pow(height,2) >= 18.5
    AND weight / pow(height,2) < 25.0 THEN '과체중'   
   
   ELSE '저체중'
   
END

 

3. 예제 문제

 

job 별로 팀을 구성하려고 한다. 50대 이상은 제외하고 team이라는 열을 하나 추가하여, 만드시오. 단 Job이 존재하지 않으면, team의 값을 No_Job으로 설정하시오.(테이블의 이름은 info입니다.)

 

ID Age Name Job
qwerty 40 강박사 삽질
korea123 50 정줄줄 삽질
hello135 32 조용훈 전기
victory049 25 김나박 삽질
asdfg 37 이원수  
iloveyou123 39 김가영 동바리
ayounglee 29 이아영 전기
nopain 54 김갑수 전기
asap 45 전철영  

 

정답

SELECT *
FROM (
	SELECT ID, Age, Name, Job
	CAST(CASE WHEN Job = '삽질' THEN 'A(삽질)'
	WHEN Job='전기' THEN 'B(전기)'
	WHEN Job='미장' THEN 'C(동바리)'
	else No_Job end as char) as Team

	FROM info
    WHERE Age < 50
)

 

ID Age Name Job Team
qwerty 40 강박사 삽질 A(삽질)
korea123 50 정줄줄 삽질 A(삽질)
hello135 32 조용훈 전기 B(전기)
victory049 25 김나박 삽질 A(삽질)
asdfg 37 이원수   No_Job
iloveyou123 39 김가영 동바리 C(동바리)
ayounglee 29 이아영 전기 B(전기)
nopain 54 김갑수 전기 B(전기)
asap 45 전철영   No_Job

 

반응형

댓글