공공부하자개발 · 영어 학습 노트
SQL
SQL 중급서브쿼리·조인·함수·DDL·인덱스0/11 완료
  • 01서브쿼리: 스칼라·인라인 뷰·상관 서브쿼리, DB별 차이
  • 02EXISTS·IN·NOT IN 과 NULL 함정
  • 03조인 심화: INNER·OUTER·SELF·CROSS, Oracle (+)
  • 04집합 연산: UNION·UNION ALL·INTERSECT·MINUS/EXCEPT
  • 05조건 로직: CASE·DECODE·IIF
  • 06NULL 처리 함수
  • 07문자·날짜 함수 DB별 비교
  • 08DDL 과 제약 조건
  • 09인덱스 기초
  • 10집계와 GROUP BY·HAVING
  • 11뷰·시퀀스·자동 증가
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › SQL 중급 › 05 / 11

조건 로직: CASE·DECODE·IIF

섹션 6진행 0 / 11
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6정리‹ 이전다음 ›

3. 코드 예제

소스: sql-src/mid_05_case/01_case.sql. 앞선 레슨과 같은 dept·emp 데이터를 씁니다.

예제 1: 단순 CASE — 부서 코드를 부서 약칭으로

sql
SELECT
       e.name
     , CASE e.dept
            WHEN '개발' THEN 'DEV'
            WHEN '영업' THEN 'SALES'
            WHEN '인사' THEN 'HR'
            WHEN '지원' THEN 'SUP'
            ELSE 'ETC'
       END AS dept_short
  FROM emp e
 ORDER BY e.id;
text
NAME   | DEPT_SHORT
-------+-----------
김대표 | ETC
이팀장 | DEV
박선임 | DEV
최사원 | DEV
정팀장 | SALES
서팀장 | HR
강팀장 | SUP
한주임 | SALES
문사원 | HR
오사원 | SUP
(10행)

e.dept 값을 하나씩 WHEN 절과 동등 비교해 약칭으로 바꿨습니다. 경영팀인 김대표는 어떤 WHEN 에도 걸리지 않아 ELSE 의 ETC 로 빠졌습니다.

예제 2: 검색 CASE — 급여 구간으로 등급 나누기

sql
SELECT
       e.name
     , e.sal
     , CASE WHEN e.sal >= 600 THEN '상'
            WHEN e.sal >= 400 THEN '중'
            ELSE '하'
       END AS grade
  FROM emp e
 ORDER BY e.sal DESC;
text
NAME   | SAL | GRADE
-------+-----+------
김대표 | 900 | 상
이팀장 | 650 | 상
정팀장 | 600 | 상
서팀장 | 550 | 중
박선임 | 500 | 중
강팀장 | 500 | 중
한주임 | 400 | 중
문사원 | 380 | 하
최사원 | 350 | 하
오사원 | 330 | 하
(10행)

단순 CASE 와 달리 각 WHEN 이 독립된 범위 조건입니다. 600 이상은 상, 400 이상 600 미만은 중, 나머지는 하로 나뉘었고 경계값 600·400 은 각각 >= 조건이라 상·중에 포함됩니다.

예제 3: ELSE 생략 — 걸리지 않은 부서는 NULL

sql
SELECT
       e.name
     , e.dept
     , CASE e.dept
            WHEN '개발' THEN 'DEV'
            WHEN '영업' THEN 'SALES'
       END AS dept_short
  FROM emp e
 WHERE e.dept IN ('개발', '영업', '인사')
 ORDER BY e.id;
text
NAME   | DEPT | DEPT_SHORT
-------+------+-----------
이팀장 | 개발 | DEV
박선임 | 개발 | DEV
최사원 | 개발 | DEV
정팀장 | 영업 | SALES
서팀장 | 인사 | NULL
한주임 | 영업 | SALES
문사원 | 인사 | NULL
(7행)

이번에는 ELSE 를 뺐습니다. 인사팀 직원은 개발·영업 어느 WHEN 에도 걸리지 않아 오류 없이 NULL 이 나왔습니다. 예제 1 의 ETC 와 비교하면 ELSE 유무의 차이가 분명합니다.

예제 4: 조건 순서를 잘못 두면 첫 참에서 멈춰 뒤 조건이 죽는다

sql
SELECT
       e.name
     , e.sal
     , CASE WHEN e.sal >= 300 THEN '하'
            WHEN e.sal >= 600 THEN '상'
       END AS grade_wrong
  FROM emp e
 ORDER BY e.sal DESC;

전체 데이터의 최소 급여가 330 이라 모든 행이 sal >= 300 을 만족합니다. 첫 번째 WHEN 에서 이미 참이 되어 멈추므로, 실행해 보면 900 을 버는 김대표를 포함한 10명 전원이 두 번째 WHEN(>= 600)까지 가지 못하고 전부 하 로 나옵니다. 예제 2 처럼 큰 기준을 먼저 둬야 이 문제가 생기지 않습니다.

예제 5: ORDER BY 안의 CASE — 부서를 업무 순서대로 정렬

sql
SELECT
       e.name
     , e.dept
  FROM emp e
 ORDER BY CASE e.dept
               WHEN '개발' THEN 1
               WHEN '영업' THEN 2
               WHEN '인사' THEN 3
               WHEN '지원' THEN 4
               ELSE 9
          END
     , e.name;
text
NAME   | DEPT
-------+-----
박선임 | 개발
이팀장 | 개발
최사원 | 개발
정팀장 | 영업
한주임 | 영업
문사원 | 인사
서팀장 | 인사
강팀장 | 지원
오사원 | 지원
김대표 | 경영
(10행)

부서명을 그냥 알파벳·가나다 순으로 정렬하면 업무 순서와 다르게 섞입니다. CASE 로 부서마다 순번을 매겨 ORDER BY 에 넣으면 원하는 순서(개발→영업→인사→지원→경영)로 정렬됩니다. 같은 순번 안에서는 두 번째 정렬 기준인 이름 순으로 나뉩니다.

예제 6: WHERE 안의 CASE — 부서마다 다른 급여 기준으로 거르기

sql
SELECT
       e.name
     , e.dept
     , e.sal
  FROM emp e
 WHERE CASE e.dept
            WHEN '개발' THEN e.sal >= 500
            WHEN '영업' THEN e.sal >= 400
            ELSE FALSE
       END
 ORDER BY e.dept, e.sal DESC;
text
NAME   | DEPT | SAL
-------+------+----
이팀장 | 개발 | 650
박선임 | 개발 | 500
정팀장 | 영업 | 600
한주임 | 영업 | 400

이 결과는 (4행)으로 끝납니다. 개발은 500 이상, 영업은 400 이상만 남기고 나머지 부서는 ELSE 의 FALSE 로 전부 걸렀습니다. 같은 결과는 (dept='개발' AND sal>=500) OR (dept='영업' AND sal>=400) 으로도 만들 수 있지만, 기준이 부서마다 여러 개로 늘어날수록 CASE 한 곳에 몰아 두는 쪽이 읽기 쉽습니다.

예제 직접 실행

아래 폴더의 SQL 파일을 Git Bash 에서 H2 메모리 DB 로 실행합니다. 방언은 파일 안의 SET MODE 로 바꿉니다.

cd sql-src/mid_05_case
ls *.sql
bash ../run.sh <파일>.sql
코드 예제
  • 예제 1: 단순 CASE — 부서 코드를 부서 약칭으로
  • 예제 2: 검색 CASE — 급여 구간으로 등급 나누기
  • 예제 3: ELSE 생략 — 걸리지 않은 부서는 NULL
  • 예제 4: 조건 순서를 잘못 두면 첫 참에서 멈춰 뒤 조건이 죽는다
  • 예제 5: ORDER BY 안의 CASE — 부서를 업무 순서대로 정렬
  • 예제 6: WHERE 안의 CASE — 부서마다 다른 급여 기준으로 거르기
이전 섹션2 핵심 원리3 / 6다음 섹션4 응용 변형 예제