CASE WHEN 구문은 SQL에서 조건에 따라 다른 값을 반환하는 함수로 if-else문과 같은 역할을 한다.
기본문법
CASE WHEN 조건 1 TEHN 결과1
WHEN 조건 2 THEN 결과2
ELSE 기본값
END
위에서부터 차례대로 조건을 검사하여 처음으로 참이 되는 조건의 THEN뒤의 결과값을 반환한다.
만약 어떤 조건에도 해당하지 않는다면 ELSE 뒤의 기본값이 되며 ELSE를 생략하면 NULL이 반환된다.
가장 기본이 되는 예시를 알아보자
SELECT
order_id,
status,
CASE status WHEN 1 THEN '주문완료'
WHEN 2 THEN '배송중'
WHEN 3 THEN '배송완료'
ELSE '알 수 없음'
END AS status_name
FROM orders;
숫자값으로 되어있는 statsu칼럼을 사람이 읽기 쉬운 값으로 바꿀 대 CASE WHEN...THEN..ELSE..END 구문을 사용했다.
또는 CASE WHEN 구문을 ORDER BY와 함께 사용함으로써 정렬 우선순위를 줄 수 있다.
SELECT
id,
title,
importance
FROM notice
ORDER BY
CASE WHEN importance = 'HIGH' THEN 1
WHEN importance = 'MID' THEN 2
ELSE 3
END ASC,
created_at DESC;
importance 에 오름차순, created_at에 내림차순 정렬을 주었다.
또 다르게 사용한 방식은 CASE WHEN 구문을 활용해 boolean값으로 리턴 시키는 것이다.
SELECT
id,
title,
content,
CASE WHEN created_date >= DATE_SUB(NOW(),INTERVER 7 DAY)
TEHN TRUE
ELSE FALSE
END AS recentYn
FROM post
글의 작성날짜가 지금 기준으로 7일 전 시간 이후라면,
즉 글 작성된지가 7일 이내면 recentYn이라는 이름의 칼럼에 TRUE, 아니면 FALSE를 리턴하는 형식이다.
또는, 아래처럼 EXISTS문과 함께 사용할 수 있다. 댓글이 달려있으면 hasCommentYn에 true아니면 false를 리턴한다.
SELECT
id,
title,
writer,
CASE
WHEN EXISTS( SELECT 1 FROM comment c WHERE c.post_id p.id)
THEN TRUE
ELSE FALSE
END AS hasCommentYn
FROM post p;
이번에는 SUM()안에 CASE WHEN 구문을 사용하는 예시다.
한 공지사항 게시글이 읽고, 유저 공지사항을 읽으면 유저id와 공지사항 id가 인서트 되는 notice_read 테이블이 있다고 하자.
그러면 아래와 같이 SUM()안에 CASE WHEN구문을 사용함으로써 한 공지사항에 읽은 유저수를 같이 가져올 수 있다.
SELECT
n.id,
n.title,
SUM(
CASE
WHEN r.read_at IS NOT NULL TEHN 1
ELSE 0
END
) AS read_count
FROM notice n
LEFT JOIN notice_read r
ON n.id = r.notice_id
GROUP BY
n.id, n.title'데이터베이스' 카테고리의 다른 글
| [DB 설계] public_id?UULD?(+쿠팡 해킹 관련) (2) | 2025.12.08 |
|---|---|
| [SQL,MyBatis] INSERT ... ON DUPLICATE KEY UPDATE (0) | 2025.10.29 |
| [MyBatis] foreach (0) | 2025.10.29 |
| [SQL] 윈도우 함수란? (2) | 2025.10.22 |
| [SQL] JSON 데이터를 다루는 SQL 함수 (2) | 2025.08.13 |