mysql에서 Case 문은, if else if 문과 거의 비슷합니다. 대략적인 문법은 다음과 같습니다.

 

 cond(1), cond(2), ... 가 있어요. 이것은 case문에 걸린 조건들을 의미합니다. 이들 중, 처음으로 만족하는 조건 cond(i)에 대해서, res(i)를 리턴합니다. 만약에 cond(1), ... , cond(n) 어느 조건에도 만족하지 않으면, res(n+1)을 리턴합니다. 이것을 흐름도로 그려보면 다음과 같은데요.

 

 

 if else문과 순서도가 상당히 유사하게 그려진다는 것을 알 수 있어요. 이 문장은 값이 올 수 있는 어떤 곳에서도 사용할 수 있습니다. 그 예제를 2개만 보여드리도록 하겠습니다.

 

 


 먼저 mysql에서 제공하는 world 데이터 베이스에서 city 테이블을 보면 도시들의 목록과, 인구수가 주어져 있습니다. 저는, 여기서, 한 가지 필드를 더 출력할 건데요. 인구 수가 10만 미만이면 'small'을, 10만 ~ 99만 9999명이면 'medium'을, 100만 ~ 999만 9999이면 'large'를, 1000만 이상이면 'very large'를 출력하려고 합니다.

 

 

 먼저 10만 미만인 경우를 생각해 봅시다. 이 때에는 'small'을 출력해야 합니다. 그런가요? 따라서, 첫 번째 condition은 인구수 < 10만이 되어야 할 겁니다.

 

 

 그런데 이 경우, 인구수가 123,456인 경우 제대로 출력하지 못해요. 100,000부터 999,999까지는 'medium'을 출력해야 해요. 그러면, 인구수가 10만보다 작지는 않지만, 100만보다 작은 경우 'medium'을 출력하게 하면 됩니다.

 

 

 그런데, 이 경우 1,234,567명의 인구가 있는 도시에 대해서 처리가 되고 있지 않습니다. 100만보다 작지 않으면서 1000만보다 작은 경우, 'large'를 출력하라고 했습니다. 이미 100만보다 작은 경우, 'small'이거나, 'medium'을 출력했을 겁니다. 그러면, 3번째 조건에 들어갈 condition은 인구수 < 1000만일 겁니다.

 

 

 만약에 1000만보다 크거나 같다면, 저 세 조건에 모두 걸리지 않을 거에요. 이 때에는 very large를 출력하면 되는데요. else를 적어주면 좋겠네요.

 

 

 그러면 이대로 쿼리를 작성하면 되겠네요.

 

 

 select 절에서 서브절로 case ~ end 절을 작성하면 되겠네요. 이 부분은 제가 알아보기 쉽게 괄호를 쳐 놓았습니다.

 

 


 해커 랭크에 나온 문제 중에서는, 다음과 같은 문제가 있습니다. 레코드에 삼각형의 세 변의 길이 a, b, c가 주어졌을 때, 세 변의 길이가 같으면 'Equilateral'을, 두 변이 같으면 'Isosceles'을, 모두 다른 삼각형이면 'Scalene'을, 삼각형이 아니라면 'Not A Triangle'을 출력하라고 했습니다. 이 쿼리는 어떻게 작성하면 좋을까요?

 

 

 경우의 수는 4가지가 있으니까 이렇게 먼저 작성해 둡시다.

 

 

 먼저 세 변의 길이가 같은 경우에는 삼각형입니다. a = b = c라면 2a < a가 아니기 때문입니다. 따라서, 이 경우에 세 변의 길이가 같다는 처리 먼저 해 주셔야 합니다. 그게 아니라면 삼각형인지 판단하는 조건문을 먼저 작성해야 하는데요. 두 변의 길이가 같다고 하더라도, 3각형이 아닌 경우가 존재할 수 있기 때문입니다.

 

 

 그 다음에 두 변이 같은지를 판단하는 게 더 쉬울 겁니다. 삼각형이면서, 세 변의 길이가 같지 않은 경우, 두 변이 같거나, 모두 다른 경우 둘 뿐이거든요. 두 변의 길이가 같으려면, a와 b가 같거나, b와 c가 같거나, c와 a가 같으면 됩니다.

 

 

 두 변의 길이 조차도 다르다면, 세 변의 길이가 모두 다를 겁니다. 이 때에는 모두 다르다는 'Sca...'를 출력하시면 됩니다.

 

 

 이 순서도를 그대로, mysql의 case문을 이용해서 작성하면 아래와 같습니다.

 

 

 이렇게 해커랭크에 있는 SQL 문제도 하나 풀어보았습니다. 이 정도 예제만 분석하실 수 있으시다면 case when에 대한 이해는 하실 듯 싶습니다.