CASE 표현식과 DECODE
쉽게 말하면
CASE는 SQL 안에서 쓰는 '만약 ~이면 ~'이에요. 점수가 90 이상이면 A, 80 이상이면 B, 나머지는 C처럼 조건에 따라 다른 값을 보여 줘요. 맞는 조건이 없고 ELSE도 없으면 NULL이 나와요. Oracle의 DECODE도 같은 일을 함수 모양으로 해요.
시험용 정의
CASE 표현식은 SQL 안에서 IF-THEN-ELSE처럼 조건에 따라 다른 값을 고른다. 값을 하나씩 비교하는 단순 CASE(CASE 열 WHEN 값 THEN …)와 조건식을 쓰는 검색 CASE(CASE WHEN 조건 THEN …)가 있고, END로 끝난다. ELSE를 생략하면 맞는 조건이 없을 때 NULL이다. Oracle의 DECODE는 단순 CASE를 함수로 쓴 것이다.
비유로 이해하기
택배 분류대다. 주소를 보고 서울이면 1번 레일, 부산이면 2번 레일, 나머지는 기타 레일(ELSE)로 보낸다. 기타 레일이 없으면 상자가 바닥(NULL)에 떨어진다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 표현식 | 값 하나를 만들어 내는 식. CASE는 문장이 아니라 표현식이라 SELECT·WHERE·ORDER BY 어디에나 쓸 수 있다 |
| 단순 CASE | 기준 값 하나를 여러 값과 = 로 비교 |
| 검색 CASE | WHEN마다 자유로운 조건식(>, BETWEEN, IS NULL…) |
세 가지 모양
| 모양 | 예 | 메모 |
|---|---|---|
| 단순 CASE | CASE deptno WHEN 10 THEN 'PLAN' WHEN 20 THEN 'DEV' ELSE 'ETC' END | = 비교만 가능. NULL과 비교하면 맞지 않는다 |
| 검색 CASE | CASE WHEN sal >= 5000 THEN 'HIGH' WHEN sal >= 3000 THEN 'MID' ELSE 'LOW' END | 처음 참인 WHEN에서 멈춘다 |
| DECODE (Oracle) | DECODE(deptno, 10, 'PLAN', 20, 'DEV', 'ETC') | 인수가 짝수 개 남으면 마지막이 기본값. NULL끼리도 같다고 본다 |
자주 나오는 함정
- ELSE가 없으면 해당 없는 행은 NULL
- 단순 CASE로 NULL을 비교할 수 없다:
CASE comm WHEN NULL THEN …은 절대 맞지 않는다.CASE WHEN comm IS NULL THEN …으로 쓴다 - 범위 조건은 위에서부터 걸리므로 순서가 결과를 바꾼다
- CASE 결과값의 자료형은 같아야 한다 (한 WHEN은 숫자, 다른 WHEN은 문자면 오류)
시험에 이렇게 나와요
- CASE 결과 계산 (처음 참인 WHEN, ELSE 없으면 NULL)
- 단순 CASE ↔ 검색 CASE ↔ DECODE 같은 결과 고르기
- CASE 열 WHEN NULL 은 맞지 않음
- SUM(CASE WHEN …) 으로 조건별 개수·합계 (PIVOT 흉내)
출제 범위·공식 안내 기반
확인 문제
Q1. CASE WHEN sal >= 3000 THEN 'A' WHEN sal >= 5000 THEN 'B' END에서 SAL이 9000이면?
- 'A'
- 'B'
- NULL
- 오류
정답 보기
1번 'A'
CASE는 위에서부터 차례로 보다가 처음 참인 WHEN의 값을 돌려주고 멈춘다. 9000 ≥ 3000이 먼저 참이라 'A'. 범위 조건은 좁은 것부터 써야 한다.
Q2. DECODE(30, 10, 'A', 20, 'B')의 결과는?
- NULL
- 'A'
- 'B'
- 30
정답 보기
1번 NULL
일치하는 값이 없고 기본값 인수가 없으므로 NULL.
Q3. CASE deptno WHEN 10 THEN 'A' ELSE 'B' END와 같은 결과를 내는 것은?
- DECODE(deptno, 10, 'A', 'B')
- NVL(deptno, 'A')
- DECODE(deptno, 'A', 10, 'B')
- NULLIF(deptno, 10)
정답 보기
1번 DECODE(deptno, 10, 'A', 'B')
DECODE(기준, 비교값, 결과, 기본값).
Q4. SAL이 4000일 때 CASE WHEN sal > 1000 THEN 1 WHEN sal > 3000 THEN 2 ELSE 3 END의 결과는?
- 1
- 2
- NULL
- 3
정답 보기
1번 1
첫 WHEN(4000 > 1000)이 참이라 1에서 멈춘다.
Q5. CASE WHEN comm IS NULL THEN 0 ELSE comm END와 같은 결과를 내는 것은?
- NVL2(comm, 0, comm)
- COALESCE(0, comm)
- NULLIF(comm, 0)
- NVL(comm, 0)
정답 보기
4번 NVL(comm, 0)
NVL2(comm, 0, comm)은 값이 있으면 0이라 반대다. COALESCE(0, comm)은 늘 0이다.
Q6. deptno가 NULL인 행에서 CASE deptno WHEN NULL THEN 'X' ELSE 'Y' END의 결과는?
- 'Y'
- NULL
- 'X'
- 오류
정답 보기
1번 'Y'
단순 CASE는 deptno = NULL로 비교해 참이 되지 않으므로 ELSE로 간다. NULL은 WHEN deptno IS NULL(검색 CASE)로 잡는다.
헷갈리기 쉬운 O·X
CASE 표현식에서 ELSE를 생략하면 오류가 난다.
정답 보기
X 오류가 아니라 해당 없는 행이 NULL이 된다.
CASE는 SELECT 절뿐 아니라 WHERE, ORDER BY 절에서도 쓸 수 있다.
정답 보기
O 값 하나를 만드는 표현식이기 때문이다.
CASE comm WHEN NULL THEN 0 END는 COMM이 NULL인 행에 0을 돌려준다.
정답 보기
X 단순 CASE는 = 로 비교하므로 NULL과 맞지 않는다. 결과는 NULL.