오늘 Programmers에서 SQL 고득점Kit 문제를 풀던 중 CASE문에 대해 새롭게 안 부분이 있어서 다시 공부한 김에 블로그에 간단하게
정리해 보려고 한다.
CASE란?
CASE는 SQL에서 조건에 따라 다른 값을 반환하는 문법이다.
자바에서
if / else
switch
와 비슷한 역할은 한다고 이해하면 된다.
- 기본 형태
CASE
WHEN 조건 THEN 값
WHEN 조건 THEN 값
ELSE 값
END
- 기본 예시
SELECT
NAME,
SCORE,
CASE
WHEN SCORE >= 90 THEN 'A'
WHEN SCORE >= 80 THEN 'B'
WHEN SCORE >= 70 THEN 'C'
ELSE 'F'
END AS GRADE
FROM STUDENT;
추가 설명하지 않더라도 쉽게 이해할 수 있는 문법이라 생각한다.
내가 블로그에 CASE문에 대해 작성하게 된 이유는 바로 CASE문의 '컬럼 생성' 역할과 '이중'으로 사용가능하다는 점
그리고 MAX, MIN과의 결합으로 새로운 의미를 담아낼 수 있기 때문이다.
(실제로 컬럼을 생성하는 것이 아닌 SELECT 결과 컬럼을 표현식으로 만들어 내는 것)
먼저, 프로그래머스 문제를 확인해보자.

해당 테이블에는 'AVAILABILITY' 라는 컬럼이 존재하지 않는다 -> 표현식과 'AS'를 사용해서 컬럼을 만들어야 한다.
10월 16일 기준으로 대여 가능 여부를 판단 하여 가능 -> '대여 가능', 불가능 -> '대여중' 으로 표현해야 한다.
이를 처리하기 위해 CASE문을 사용하게 되는데 문제는 하나의 자동차 ID가 여러 개의 history를 갖고 있다는 것이다.
이를 단순히 GROUP BY로 CAR_ID를 묶게 되면 하나의 CAR_ID 안에 여러 START_DATE, END_DATE가 존재하게 된다.
이 경우 SQL은 어떤 날짜 데이터를 기준으로 대여 가능 여부를 판단해야 하는지 알 수 없게 된다.
이러한 이유로 MAX()를 사용하여 의미를 정확하게 부여해야 한다.
SELECT
CAR_ID
, CASE
WHEN MAX(
CASE
WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE
THEN 1
ELSE 0
END
) = 1
THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
이거 내가 최종적으로 작성한 답안이다.
첫 번째 CASE문을 통해
2022-10-16이 대여 시작일과 종료일 사이에 존재한다면 1, 아니라면 0을 반환하도록 했다.
이후 MAX()를 사용하여 하나의 자동차에 여러 대여 기록이 존재하더라도
하나라도 1이 존재한다면 최종적으로 '대여중' 상태가 되도록 처리했다.
즉, 여기서 MAX는 단순 최대값 비교가 아니라
"조건을 만족하는 데이터가 하나라도 존재하는가" 를 판단하는 역할로 사용되었다.
'SQL' 카테고리의 다른 글
| [프로그래머스] 조건에 맞는 사원 정보 조회하기 (0) | 2026.05.15 |
|---|---|
| SQLD 공부 2일차 (0) | 2025.05.31 |
| SQLD 공부 1일차 (0) | 2025.05.29 |