소스: sql-src/mid_05_case/01_case.sql. 앞선 레슨과 같은 dept·emp 데이터를 씁니다.
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;NAME | DEPT_SHORT
-------+-----------
김대표 | ETC
이팀장 | DEV
박선임 | DEV
최사원 | DEV
정팀장 | SALES
서팀장 | HR
강팀장 | SUP
한주임 | SALES
문사원 | HR
오사원 | SUP
(10행)e.dept 값을 하나씩 WHEN 절과 동등 비교해 약칭으로 바꿨습니다. 경영팀인 김대표는 어떤 WHEN 에도 걸리지 않아 ELSE 의 ETC 로 빠졌습니다.
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;NAME | SAL | GRADE
-------+-----+------
김대표 | 900 | 상
이팀장 | 650 | 상
정팀장 | 600 | 상
서팀장 | 550 | 중
박선임 | 500 | 중
강팀장 | 500 | 중
한주임 | 400 | 중
문사원 | 380 | 하
최사원 | 350 | 하
오사원 | 330 | 하
(10행)단순 CASE 와 달리 각 WHEN 이 독립된 범위 조건입니다. 600 이상은 상, 400 이상 600 미만은 중, 나머지는 하로 나뉘었고 경계값 600·400 은 각각 >= 조건이라 상·중에 포함됩니다.
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;NAME | DEPT | DEPT_SHORT
-------+------+-----------
이팀장 | 개발 | DEV
박선임 | 개발 | DEV
최사원 | 개발 | DEV
정팀장 | 영업 | SALES
서팀장 | 인사 | NULL
한주임 | 영업 | SALES
문사원 | 인사 | NULL
(7행)이번에는 ELSE 를 뺐습니다. 인사팀 직원은 개발·영업 어느 WHEN 에도 걸리지 않아 오류 없이 NULL 이 나왔습니다. 예제 1 의 ETC 와 비교하면 ELSE 유무의 차이가 분명합니다.
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 처럼 큰 기준을 먼저 둬야 이 문제가 생기지 않습니다.
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;NAME | DEPT
-------+-----
박선임 | 개발
이팀장 | 개발
최사원 | 개발
정팀장 | 영업
한주임 | 영업
문사원 | 인사
서팀장 | 인사
강팀장 | 지원
오사원 | 지원
김대표 | 경영
(10행)부서명을 그냥 알파벳·가나다 순으로 정렬하면 업무 순서와 다르게 섞입니다. CASE 로 부서마다 순번을 매겨 ORDER BY 에 넣으면 원하는 순서(개발→영업→인사→지원→경영)로 정렬됩니다. 같은 순번 안에서는 두 번째 정렬 기준인 이름 순으로 나뉩니다.
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;NAME | DEPT | SAL
-------+------+----
이팀장 | 개발 | 650
박선임 | 개발 | 500
정팀장 | 영업 | 600
한주임 | 영업 | 400이 결과는 (4행)으로 끝납니다. 개발은 500 이상, 영업은 400 이상만 남기고 나머지 부서는 ELSE 의 FALSE 로 전부 걸렀습니다. 같은 결과는 (dept='개발' AND sal>=500) OR (dept='영업' AND sal>=400) 으로도 만들 수 있지만, 기준이 부서마다 여러 개로 늘어날수록 CASE 한 곳에 몰아 두는 쪽이 읽기 쉽습니다.