본문 바로가기
Language & Tool/sql

🗄️CASE문 문법 및 활용법 총정리 (Simple / Searched / SUM() 활용 / ORDER BY절에서의 사용)

by 박수무당벌레 2026. 7. 6.

1. 단순 CASE 문 (Simple CASE)

특정 컬럼이나 표현식의 값이 특정 값과 일치하는지 비교할 때 사용한다

CASE 컬럼명
    WHEN 값1 THEN 결과1
    WHEN 값2 THEN 결과2
    ELSE 기본결과
END

예시: 직급(job)에 따라 한글 명칭으로 변경하여 조회할 때

SELECT name,
       CASE job
           WHEN 'MANAGER' THEN '관리자'
           WHEN 'ANALYST' THEN '분석가'
           ELSE '일반직원'
       END AS job_ko
FROM employees;

2. 검색형 CASE 문 (Searched CASE)

각 WHEN 절에 서로 다른 조건식(비교 연산자, 범위 등)을 자유롭게 지정할 수 있어 훨씬 더 널리 쓰이는 방식

CASE 
    WHEN 조건식1 THEN 결과1
    WHEN 조건식2 THEN 결과2
    ELSE 기본결과
END

코드: 점수(score)에 따라 성적 등급을 부여할 때

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 students;

3. CASE 문 활용법 (1) ─  SUM(CASE WHEN ...)을 활용한 데이터 집계 (Pivot 효과)

기본적인 CASE 문은 위에서 아래로 행을 하나씩 읽으며 데이터를 단순히 매핑하지만, 실무에선 이를 집계 함수(SUM, COUNT 등) 내부에 사용해서 가로로 펼쳐진 요약 리포트(Pivot 테이블)를 만들어 특정 조건의 데이터만 필터링하여 통계를 내는 작업이 훨씬 많다.

SQL 쿼리 예시

  • 상황: employees 테이블에 부서 번호(dept_id)와 성별(gender) 데이터가 있을 때, 각 부서별로 남성 직원 수와 여성 직원 수가 각각 몇 명인지 한눈에 보고 싶을 때
SELECT 
    dept_id,
    -- 성별이 'M'이면 1을 더하고, 아니면 0을 더함 -> 결과적으로 남성 수 집계
    SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
    -- 성별이 'F'이면 1을 더하고, 아니면 0을 더함 -> 결과적으로 여성 수 집계
    SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count,
    -- 전체 직원 수
    COUNT(*) AS total_count
FROM employees
GROUP BY dept_id;
더보기

💻 결과 예시

 

dept_id male_count female_count total_count
10 (인사과) 2 5 7
20 (개발과) 12 3 15

4. CASE 문 활용법 (2) ─ ORDER BY 절에서 CASE 문을 활용한 사용자 정의 정렬

일반적으로 ORDER BY는 숫자나 알파벳, 한글 순서(오름차순/내림차순)로만 정렬할 수 있는 반면, 내가 원하는 특정 직급이나 상태를 무조건 맨 위로 올리고 싶을 때 CASE 문을 정렬 조건으로 쓸 수 있다.

웹 애플리케이션의 게시판이나 대시보드를 만들 때 '공지사항 무조건 상단 노출', '특정 상태값 우선 정렬' 같은 비즈니스 로직을 DB 레벨에서 아주 쉽게 해결해 주는 강력한 방법

SQL 쿼리 예시

  • 상황: 회사의 회원 목록을 출력하는데, 일반적인 이름 순서가 아니라 탈퇴하거나 정지된 회원을 무조건 리스트 맨 아래로 보내고, 활성 상태인 회원을 맨 위로 정렬하고 싶을 때
    • 정렬 우선순위: ACTIVE (1순위) ➡️ PENDING (2순위) ➡️ SUSPENDED (3순위)
SELECT user_id, name, status
FROM users
ORDER BY 
    CASE status
        WHEN 'ACTIVE' THEN 1
        WHEN 'PENDING' THEN 2
        WHEN 'SUSPENDED' THEN 3
        ELSE 4
    END ASC, 
    name ASC; -- 상태가 같으면 이름 순으로 정렬

5. 기억해두면 좋은 핵심 포인트

  1. 위에서 아래로 순차적 평가: 조건은 위에서부터 순서대로 평가된다. 첫 번째로 만족하는 WHEN 절의 THEN 결과만 반환하고, 뒤에 있는 조건은 검사하지 않고 넘어간다.
  2. ELSE 생략 가능 (하지만 권장하지 않음): ELSE 절을 생략했는데 만족하는 WHEN 조건이 하나도 없다면 NULL을 반환한다. 데이터 왜곡이나 예기치 못한 NULL 처리를 방지하기 위해 ELSE를 명시해 주는 것이 좋음.
  3. 반환 타입 일치: THEN과 ELSE 뒤에 오는 모든 결과 값들은 동일한 데이터 타입(또는 상호 호환되는 타입)이어야 한다. (예: 하나는 문자열을 반환하고, 다른 하나는 숫자를 반환하면 오류가 발생.)
  4. END로 마무리: CASE 문은 반드시 END로 닫아주어야 함. 뒤에 AS 별칭을 붙여서 컬럼 이름을 깔끔하게 지정하는 것이 일반적.