반응형
- 이 글은 제가 공부를 하며, 이해한 것을 바탕으로 작성하는 글입니다.
- 그렇기에 틀리거나 잘못된 부분이 있을 수 있습니다.
- 글의 오류를 발견하시면, 댓글로 말씀해 주시면 정말 감사하겠습니다.
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 |
반응형
'DataBase > MYSQL' 카테고리의 다른 글
[MYSQL] CAST 함수- 값의 형변환을 해줍니다. (0) | 2021.09.27 |
---|---|
[MYSQL] DATA TYPE (Version 8.0) (0) | 2021.07.09 |
[MYSQL] DATE_FORMAT 함수 - 날짜 포맷/ 형식 지정하기 (0) | 2021.07.09 |
[MYSQL] TIMEDIFF/ DATEDIFF /TIMESTAMPDIFF 함수 - 날짜 차이 계산 (0) | 2021.07.09 |
[MYSQL] CHAR_LENGTH 함수 - 문자열 길이 (2) | 2021.05.31 |
댓글