MySQL - CASE로 데이터 변환하기

Posted by Juri on October 13, 2021

SQL의 CASEWHEN과THEN과 함께 쓰여 파이썬의 if와 같은 역할을 한다.

CASE WHEN 조건 THEN 식

WHEN 의 조건에는 참과 거짓을 반환하는 조건식을 쓴다. 조건을 만족해 참을 반환하면 THEN에 있는 식이 처리된다. WHEN과 THEN을 복수로 써서 조건을 여러개 지정할 수도 있다.

CASE WHEN 조건 THEN 식
ELSE 식

어떤 조건도 만족하지 못했을 경우 ELSE에 있는 식이 처리된다. 이 때 사용되는 ELSE는 생략이 가능하다. 생략했을 땐 ELSE NULL로 간주된다.

예제 - 단순 CASE

1
2
3
4
5
6
SELECT a AS "코드",
CASE
 WHEN a=1 THEN '남자'
 WHEN a=2 THEN '여자'
 ELSE '미지정'
END AS "성별" FROM test_table;

이 때 ELSE에 걸리는 데이터는 ‘a 컬럼이 1 또는 2가 아닌 경우’이다.

CASE 뒤에 대상을 적어도 된다.

1
2
3
4
5
6
SELECT a AS "코드",
CASE a
 WHEN 1 THEN '남자'
 WHEN 2 THEN '여자'
 ELSE '미지정'
END AS "성별" FROM test_table;
1
2
3
4
5
6
SELECT a AS "코드", "성별" = 
CASE a
WHEN 1 THEN "남자"
WHEN 2 THEN "여자"
ELSE "미지정"
END FROM test_table;

세 코드 모두 같은 테이블을 반환한다.


예제2 - 삼각형 판별하기

해커스랭크 - TYPE OF TRIANGLE

1
2
3
4
5
6
7
SELECT CASE
            WHEN A = B AND B = C THEN 'Equilateral'
            WHEN A + B <= C OR A + C <= B OR B + C <= A THEN 'Not A Triangle'
            WHEN A = B OR A = C OR B = C THEN 'Isosceles'
            ELSE 'Scalene'
            END
FROM Triangles

CASE문에서는 조건의 순서를 유의해야 한다. 세 변이 각 20, 20, 40 인 경우엔 두번째 조건과 세번째 조건을 동시에 만족하지만 Not A Triangle이 되어야하기 때문에 두번째 조건이 세번째 조건보다 상위의 조건이 된다. 만약 한 조건을 충족한다면 그 이후의 조건에는 자동으로 해당하지 않게된다.


  • CASE는 SELECT를 비롯한 WHERE, ORDER BY 와도 함께 사용할 수 있다.
  • ELSE를 생략할 경우 ELSE NULL이 되므로 주의해야 한다. 되도록 ELSE는 생략하지 않고 지정한다.
  • 조건이 여러개가 올때는 어떤 조건이 우선되어야 할지 유의하여 순서를 정한다.