MySQL CASE WHEN —
다중 조건 분기 완전 정리
숫자 하나를 두고 여러 후보값과 순서대로 비교해서, 처음 맞아떨어지는 결과를 돌려주는 코드다. 프로그래밍 언어의 switch문과 정확히 같은 발상이며, SQL에서는 이 역할을 CASE WHEN이 맡는다. 뒤에 이어지는 ASCII·CHAR는 문자와 코드값을 서로 바꿔주는 보조 함수다.
첫 번째 쿼리 결과 — CASE 값이 10이므로 WHEN 10에서 매칭되어 그 즉시 비교를 멈춘다.
| CASE연습 |
|---|
| 십 |
두 번째 쿼리 결과 — 문자 'A'와 코드값 65는 서로의 짝이다.
| ASCII('A') | CHAR(65) |
|---|---|
| 65 | A |
CASE 식은 CASE로 열어서 END로 반드시 닫아야 하는 하나의 "표현식"이다. 그 사이에 WHEN 조건 THEN 결과 쌍을 원하는 만큼 나열하고, 마지막에 ELSE 기본값을 둘 수 있다. 이 코드에서는 다음과 같이 대응된다.
오늘 코드의 CASE 10 WHEN 1 THEN ...은 단순 CASE다. CASE 바로 뒤에 비교 기준값(10)을 딱 한 번만 적고, 각 WHEN은 그 값과 같은지(=)만 비교한다. 반면 범위나 부등호 비교가 필요하면 검색 CASE를 써야 한다 — CASE 뒤에 값이 없고, 각 WHEN 자체가 독립된 조건식이 된다.
WHEN 값1 THEN 결과1
WHEN 값2 THEN 결과2
END
→ 동등 비교(=)만 가능
WHEN 컬럼 > 90 THEN 'A'
WHEN 컬럼 >= 80 THEN 'B'
END
→ 부등호·범위·복합조건 가능
CASE는 WHEN을 위에서부터 차례로 검사하다가, 처음으로 조건이 참인 WHEN을 만나는 순간 그 THEN 값을 반환하고 나머지는 전혀 확인하지 않는다. 오늘 코드에서 10은 WHEN 10과도 맞지만 그 전에 있는 WHEN 1, WHEN 5를 먼저 거쳐야 한다.
- 여러 WHEN이 동시에 참이 될 수 있는 검색 CASE라도, 먼저 나온 WHEN이 이긴다
- 따라서 검색 CASE에서는 좁은 조건(예: 100점)을 위에, 넓은 조건(예: 60점 이상)을 아래에 둬야 한다
- 순서를 반대로 두면 항상 첫 번째 넓은 조건에서만 걸려 뒤의 조건이 죽은 코드가 된다
모든 WHEN이 거짓인데 ELSE가 없으면, CASE 식은 조용히 NULL을 반환한다. 에러가 나지 않기 때문에 눈치채기 어렵고, 통계나 집계에서 값이 빠진 것처럼 보이는 원인이 된다.
ELSE '모름'이 있어서 안전하다. 실무에서는 "예상 밖의 값이 들어와도 화면에 뭔가는 보여준다"는 의미에서 ELSE를 거의 항상 넣는 습관이 안전하다.원본 컬럼 값(숫자, 코드)은 그대로 보여주면 사람이 읽기 불편할 때가 많다. CASE를 SELECT의 컬럼 자리에 그대로 끼워 넣으면, 저장된 값은 그대로 두고 출력할 때만 사람이 읽기 좋은 텍스트로 바꿔서 보여줄 수 있다.
AS 별칭을 붙이면, 이후 ORDER BY 등급처럼 그 별칭을 다른 절에서도 재사용할 수 있다 (오늘 코드의 AS 'CASE연습'도 같은 원리).ORDER BY는 기본적으로 오름차순·내림차순만 지원한다. 하지만 "특정 값을 맨 위로", "이 세 값은 이 순서로" 같은 임의의 순서가 필요할 때, CASE를 ORDER BY 절 안에 넣으면 각 행마다 정렬 기준 숫자를 즉석에서 만들어낼 수 있다.
컴퓨터는 문자를 내부적으로 숫자(코드값)로 저장한다. ASCII('A')는 문자 A에 대응하는 코드값 65를 돌려주고, CHAR(65)는 그 반대로 코드값 65를 다시 문자 'A'로 되돌린다. 이 둘은 정확히 서로의 역함수다.
| 함수 | 입력 | 결과 | 방향 |
|---|---|---|---|
ASCII(문자) |
'A' | 65 | 문자 → 코드값 |
CHAR(숫자) |
65 | 'A' | 코드값 → 문자 |
| 실수 | 증상 | 해결 |
|---|---|---|
END을 빠뜨림 |
SQL 문법 오류 (구문 파싱 실패) | CASE를 열었으면 반드시 END로 닫기 |
ELSE를 생략 |
매칭 안 되면 조용히 NULL 반환 | 예상 밖 값 대비용 ELSE를 습관적으로 작성 |
| 단순 CASE에 부등호 조건 시도 | 문법 오류 또는 의도와 다른 결과 | 범위·부등호 비교는 검색 CASE로 전환 |
| 검색 CASE에서 조건 순서를 넓은 것부터 배치 | 뒤의 좁은 조건이 절대 실행되지 않음 | 좁은 조건을 위, 넓은 조건을 아래로 |
CASE 결과에 AS 별칭을 안 붙임 |
컬럼명이 CASE ... END처럼 지저분하게 나옴 |
END AS 별칭으로 이름 지정 |
| ASCII/CHAR 인자 타입 착각 | ASCII에 여러 글자, CHAR에 문자 전달 등으로 의도와 다른 결과 | ASCII는 문자(맨 앞 글자만), CHAR는 숫자 코드값을 인자로 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| MySQL SUBSTRING · SPACE · SUBSTRING_INDEX — 문자열 추출 완전 정리 (0) | 2026.06.27 |
|---|---|
| MySQL PAD · TRIM — 패딩·공백 제거 완전 정리 (0) | 2026.06.27 |
| MySQL IF · IFNULL · NULLIF — 조건·NULL 처리 완전 정리 (0) | 2026.06.27 |
| MySQL CONCAT — 문자열 연결 완전 정리 (0) | 2026.06.27 |
| MySQL SET 변수 · PREPARE — 동적 쿼리 완전 정리 (0) | 2026.06.27 |
왕진 블로그

댓글