어떤 값을 조건에 따라 다른 값으로 가공해야 할 때가 있습니다. 예를 들어, 점수가 A+이면 4.5로, A이면 4.3으로 가공해야 하는 요구 사항이 있을 수 있습니다. 이 때 사용할 수 있는 것이 sql case when 절입니다.
sql case when 절의 기본 구조
먼저, 이 구문의 기본 구조를 알아보겠습니다.
case
condition1 을 만족하면 value1 이 되고
when condition1 then value1
…
when conditionn then valuen
else valueo
end
…
conditionn 을 만족하면 valuen 이 됩니다.
모든 case 절에 걸리지 않으면 valueo가 됩니다.
switch 문과 유사하다고 생각하시면 편합니다.
이런 그림이라고 생각하시면 편해요. cond(1)을 만족하면, value(1)이 출력됩니다. 그게 아니라면
- cond(2)를 검사합니다.
- 만약에 조건을 만족하면 value(2)가 출력됩니다.
- 그게 아니라면 밑으로 내려갑니다.
- 이렇게 모든 cond를 만족하지 않은 경우
- else 절에 걸립니다.
간단한 예제 몇 개를 보도록 할게요.
예제 1
상품의 코드 앞 글자가 ‘B’이면 책, ‘F’ 이면 음식이라 해 볼게요.
product_name은 F 또는 B로만 시작해요. 우리는 product_name에 따라, Book 혹은 Food를 출력하고 싶어요. 이럴 때 어떻게 하면 될까요?
순서도를 그리면 요래 걸립니다. product_name의 1번째 글자를 따 오기 위해서
- left 함수를 이용합니다.
- left(product_name, 1)을 이용하면 됩니다.
이 값이 ‘F’이면 ‘Food’가 되겠군요. ‘B’이면 ‘Book’이지요?
따라서, case when 절을 이용해 쿼리를 작성하면 위와 같습니다.
- 1번째 when 절에서, product_name의 1번째 글자가 ‘F’이면 ‘Food’ 를 출력합니다.
- 1번째 when 절의 조건을 만족하지 않으면
- 2번째 when 절이 걸립니다.
- product_name의 1번째 글자가 ‘B’이면 ‘Book’을 출력합니다.
그러면 결과가 어떻게 나올까요?
product name이 F로 시작하면 Food가, B로 시작하면 Book이 나왔습니다. 물론 이렇게 간단한 예제인 경우, if 절로 처리해도 무난합니다.
- 조건이 하나이고
- 조건을 만족하면 특정 값을 출력하고
- 해당 조건에 만족하지 못하면 다른 값을 출력하는 형태.
조건이 둘 이상이면 if 대신 case when 절을 쓰는 게 좋습니다.
예제 2
예제 2번은 A+, A와 같은 성적을 4.5, 4.3 등의 평점으로 변환시킵니다.
takes 테이블은 section과 student에서 쓰게 되는데요. 이 예제에서는 문자 형태로 표현된 takes의 grade를 실수 형태의 4.5, 4.3 등으로 변환합니다.
A+는 4.5, A는 4.3, A-는 4.0 등으로 변환한다고 가정해 봅시다. 그러면 우리는 조건을
- grade가 A+이면 4.5
- grade가 A+이 아닌 A이면 4.3
- …
요런 식으로 변환할 수 있습니다. 역시 각각의 condition은 when 절에 붙이고, 값은 then 절에 붙이기만 하면 됩니다.
그림으로 그리면 이런 상황입니다. 따라서, 쿼리는 아래와 같이 작성하면 됩니다.
학점은 A+부터 D-까지 있으므로, 12개의 조건에 대해 case when 절로 처리하였습니다. 만약에, D- 이하인 경우에는 어떨까요? 이 경우
- 어떠한 when 절에도 걸리지 않습니다. 이 때, 0이라는 값을 주고 싶은 경우
- else 절에 0을 주면 됩니다.
else 절은 어떠한 when 절에도 걸리지 않을 때 처리되는 부분이기 때문입니다. 결과를 봅시다.
grade가 C-인 경우 2가, B-인 경우 3이 정상적으로 출력되었음을 볼 수 있습니다.