SQL 조건에 따라 값 정해주기 - CASE

이번에 포스팅할 내용은 CASE문입니다

조건에 따라 값을 정해주는 내용으로 흔히 프로그래밍 언어에서 쓰는 IF문과 유사합니다

MS-SQL, MySql, Oracle 모두 동일하게 사용 가능한 함수입니다

 

먼저 사용법입니다. 

CASE [EXPR] WHEN COMPARISON_EXPR1 THEN RETURN_EXPR1
            WHEN COMPARISON_EXPR2 THEN RETURN_EXPR2
            WHEN COMPARISON_EXPR3 THEN RETURN_eXPR3
            ELSE ELSE_EXPR
 END

- COMPARISON_EXPR1 이 참일때는 RETURN_EXPR1을 반환하고

- COMPARISON_EXPR2 이 참일때는 RETURN_EXPR2를 반환하고

- COMPARISON_EXPR3 이 참일때는 RETURN_EXPR3을 반환하고

- 모두 거짓일 경우 ELSE_EXPR을 반환하라는 쿼리입니다

* CASE 옆에 EXPR 이 있을 경우 EXPR의 값을 조건이랑 비교해 값을 리턴합니다

 

NAME AGE
철수 14
정훈 20
영희 17
훈이 11
현우 3

위와 같은 테이블이 있을 때

SELECT *
     , CASE WHEN AGE BETWEEN 14 AND 16 THEN '중학생'
            WHEN AGE BETWEEN 17 AND 19 THEN '고등학생'
            WHEN AGE >= 20 THEN '성인'
            ELSE '어린이'
        END AS 'IDENTITY'
  FROM TABLE
NAME AGE IDENTITY
철수 14 중학생
정훈 20 성인
영희 17 고등학생
훈이 11 어린이
현우 3 어린이

AGE가 14~16 사이인 철수는 '중학생'으로 출력이 되었고

AGE가 20 이상인 정훈이는 '성인'으로 출력이 되었고

WHEN 이하에 포함되지 않는 조건인 훈이와 현우는 '어린이'로 출력이 되었다

 

여러 개의 CASE문을 중첩해서 사용하는 경우도 보자

SELECT *
     , CASE WHEN AGE BETWEEN 14 AND 20 THEN (CASE NAME WHEN '철수' THEN 'A'
                                                       WHEN '훈이' THEN 'B'
                                                       WHEN '정훈' THEN 'C'
                                                       ELSE 'D' END)
            ELSE 'NO'
        END AS GRADE
  FROM TABLE

AGE가 14 이상 20 이하 인 칼럼 중에 NAME이 철수면 A를 반환 훈이면 B를 반환 정훈이면 C를 반환

NAME의 값이 철수 훈이 정훈 다 아니라면 D를 반환한다

AGE가 14 이상 20 이하가 아니라면 NO를 반환하라는 쿼리이다

NAME AGE GRADE
철수 14 A
정훈 20 C
영희 17 D
훈이 11 NO
현우 3 NO

철수는 A의 값을 반환했고 정훈이는 C를 반환했다

하지만 훈이는 B가 아니라 NO를 반환하고 있는데 이는

처음 CASE의 조건인 AGE가 11로 14 이상 20 이하에 포함되지 않았기 때문이다

AGE가 14 이상 20이하지만 철수/훈이/정훈 이가 아니었던 영희는 ELSE의 값 D를 반환하고

훈이 현우는 AGE가 14이상 20 이하가 아니어서 NO를 반환하고 있다