본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL CASE WHEN — 다중 조건 분기 완전 정리

by 왕진 2026. 6. 27.
반응형

 

 

Database · MySQL

MySQL CASE WHEN —
다중 조건 분기 완전 정리

값 하나로 여러 결과를 갈라내는 SQL의 조건문 — 단순 CASE와 검색 CASE, 그리고 ASCII·CHAR
시작 오늘 분석할 코드

숫자 하나를 두고 여러 후보값과 순서대로 비교해서, 처음 맞아떨어지는 결과를 돌려주는 코드다. 프로그래밍 언어의 switch문과 정확히 같은 발상이며, SQL에서는 이 역할을 CASE WHEN이 맡는다. 뒤에 이어지는 ASCII·CHAR는 문자와 코드값을 서로 바꿔주는 보조 함수다.

SELECT CASE 10 -- CASE 값이 10 WHEN 1 THEN '일' -- 비교값 1 일때 결과값 일 을 출력 WHEN 5 THEN '오' -- 비교값 5 일때 결과값 오 를 출력 WHEN 10 THEN '십' -- 비교값 10 일때 결과값 십 을 출력 / 매칭 ELSE '모름' END AS 'CASE연습'; -- 결과값 '십' SELECT ASCII('A'), CHAR(65);
실제 결과 미리보기

첫 번째 쿼리 결과 — CASE 값이 10이므로 WHEN 10에서 매칭되어 그 즉시 비교를 멈춘다.

CASE연습

두 번째 쿼리 결과 — 문자 'A'와 코드값 65는 서로의 짝이다.

ASCII('A') CHAR(65)
65 A
용어 용어 정리
CASE조건 분기를 시작하는 키워드 — 비교 대상 값 또는 자체 조건식 지정
WHEN"이 값이면" 또는 "이 조건이면"에 해당하는 비교 절
THENWHEN 조건이 맞았을 때 반환할 결과값
ELSE모든 WHEN에 해당하지 않을 때의 기본값 (생략 가능, 생략 시 NULL)
ENDCASE 식을 닫는 키워드 — 반드시 짝을 맞춰야 함
단순 CASECASE 뒤에 값 하나를 두고 WHEN에서 그 값과 동등 비교만 하는 형태
검색 CASECASE 뒤에 값이 없고 각 WHEN에 독립된 조건식(부등호 등)을 쓰는 형태
ASCII / CHAR문자 → 코드번호, 코드번호 → 문자로 상호 변환하는 함수

1 CASE WHEN THEN ELSE END — 기본 뼈대
왜 다섯 개의 키워드가 세트로 다니는가?

CASE 식은 CASE로 열어서 END로 반드시 닫아야 하는 하나의 "표현식"이다. 그 사이에 WHEN 조건 THEN 결과 쌍을 원하는 만큼 나열하고, 마지막에 ELSE 기본값을 둘 수 있다. 이 코드에서는 다음과 같이 대응된다.

CASE 10 ← 비교할 값은 10 WHEN 1 THEN '일' ← 10 = 1 ? 아니오 WHEN 5 THEN '오' ← 10 = 5 ? 아니오 WHEN 10 THEN '십' ← 10 = 10 ? 예 → '십' 반환하고 종료 ELSE '모름' ← (이미 위에서 끝났으므로 실행 안 됨) END AS 'CASE연습'
※ CASE 식 전체는 값 하나를 돌려주는 표현식이다. IF문처럼 코드 흐름을 바꾸는 게 아니라, SELECT의 컬럼 자리에 들어갈 값 하나를 계산해내는 것뿐이다.

2 단순 CASE vs 검색 CASE
왜 CASE 문법이 두 가지인가?

오늘 코드의 CASE 10 WHEN 1 THEN ...단순 CASE다. CASE 바로 뒤에 비교 기준값(10)을 딱 한 번만 적고, 각 WHEN은 그 값과 같은지(=)만 비교한다. 반면 범위나 부등호 비교가 필요하면 검색 CASE를 써야 한다 — CASE 뒤에 값이 없고, 각 WHEN 자체가 독립된 조건식이 된다.

단순 CASE (Simple)
CASE 컬럼
  WHEN 값1 THEN 결과1
  WHEN 값2 THEN 결과2
END

→ 동등 비교(=)만 가능
검색 CASE (Searched)
CASE
  WHEN 컬럼 > 90 THEN 'A'
  WHEN 컬럼 >= 80 THEN 'B'
END

→ 부등호·범위·복합조건 가능
※ 오늘 코드처럼 "10, 1, 5"라는 딱 떨어지는 숫자 매칭이 아니라 "90점 이상은 A, 80점 이상은 B" 같은 범위 비교가 필요하면 단순 CASE로는 표현이 안 된다. 이때는 검색 CASE로 바꿔야 한다.

3 CASE가 평가되는 순서 — 위에서 아래로, 첫 매칭에서 즉시 종료
왜 순서가 중요한가?

CASE는 WHEN을 위에서부터 차례로 검사하다가, 처음으로 조건이 참인 WHEN을 만나는 순간 그 THEN 값을 반환하고 나머지는 전혀 확인하지 않는다. 오늘 코드에서 10은 WHEN 10과도 맞지만 그 전에 있는 WHEN 1, WHEN 5를 먼저 거쳐야 한다.

WHEN 1 THEN '일'
✗→
WHEN 5 THEN '오'
✗→
WHEN 10 THEN '십'
✓ 종료
※ 핵심 규칙
  • 여러 WHEN이 동시에 참이 될 수 있는 검색 CASE라도, 먼저 나온 WHEN이 이긴다
  • 따라서 검색 CASE에서는 좁은 조건(예: 100점)을 위에, 넓은 조건(예: 60점 이상)을 아래에 둬야 한다
  • 순서를 반대로 두면 항상 첫 번째 넓은 조건에서만 걸려 뒤의 조건이 죽은 코드가 된다

 

반응형

 

4 ELSE의 역할 — 생략하면 무슨 일이 벌어지는가
ELSE가 없으면 결과가 사라진다?

모든 WHEN이 거짓인데 ELSE가 없으면, CASE 식은 조용히 NULL을 반환한다. 에러가 나지 않기 때문에 눈치채기 어렵고, 통계나 집계에서 값이 빠진 것처럼 보이는 원인이 된다.

CASE 20 WHEN 1 THEN '일' WHEN 5 THEN '오' WHEN 10 THEN '십' END -- ELSE가 없으므로 20은 어디에도 안 걸림 → 결과: NULL
※ 오늘 코드는 ELSE '모름'이 있어서 안전하다. 실무에서는 "예상 밖의 값이 들어와도 화면에 뭔가는 보여준다"는 의미에서 ELSE를 거의 항상 넣는 습관이 안전하다.

5 SELECT 컬럼 자리에서 CASE 활용 — 값을 등급으로 바꾸기
왜 컬럼 값을 그대로 안 보여주고 CASE로 가공하는가?

원본 컬럼 값(숫자, 코드)은 그대로 보여주면 사람이 읽기 불편할 때가 많다. CASE를 SELECT의 컬럼 자리에 그대로 끼워 넣으면, 저장된 값은 그대로 두고 출력할 때만 사람이 읽기 좋은 텍스트로 바꿔서 보여줄 수 있다.

SELECT 이름, 점수, CASE WHEN 점수 >= 90 THEN 'A' WHEN 점수 >= 80 THEN 'B' WHEN 점수 >= 70 THEN 'C' ELSE 'F' END AS 등급 FROM 성적표; -- 점수 컬럼은 그대로, 등급 컬럼만 CASE로 새로 계산해서 붙여줌
※ 이렇게 CASE로 만든 결과에 AS 별칭을 붙이면, 이후 ORDER BY 등급처럼 그 별칭을 다른 절에서도 재사용할 수 있다 (오늘 코드의 AS 'CASE연습'도 같은 원리).

6 ORDER BY 안에서 CASE 활용 — 원하는 순서로 커스텀 정렬
기본 정렬로는 안 되는 순서를 어떻게 만드는가?

ORDER BY는 기본적으로 오름차순·내림차순만 지원한다. 하지만 "특정 값을 맨 위로", "이 세 값은 이 순서로" 같은 임의의 순서가 필요할 때, CASE를 ORDER BY 절 안에 넣으면 각 행마다 정렬 기준 숫자를 즉석에서 만들어낼 수 있다.

SELECT * FROM 상태표 ORDER BY CASE 상태 WHEN '긴급' THEN 1 WHEN '진행중' THEN 2 WHEN '완료' THEN 3 ELSE 4 END; -- 상태값을 우선순위 숫자로 바꿔서 그 숫자 기준으로 정렬
1
각 행의 상태값 확인'긴급', '진행중', '완료' 등 문자열 그대로는 알파벳/가나다 순으로만 정렬됨
2
CASE로 우선순위 숫자 부여'긴급' → 1, '진행중' → 2, '완료' → 3으로 매핑
3
그 숫자로 ORDER BY사람이 원하는 업무 순서대로 행이 나열됨

7 ASCII · CHAR — 문자와 코드값의 상호 변환
왜 문자를 굳이 숫자로 바꾸는가?

컴퓨터는 문자를 내부적으로 숫자(코드값)로 저장한다. ASCII('A')는 문자 A에 대응하는 코드값 65를 돌려주고, CHAR(65)는 그 반대로 코드값 65를 다시 문자 'A'로 되돌린다. 이 둘은 정확히 서로의 역함수다.

함수 입력 결과 방향
ASCII(문자) 'A' 65 문자 → 코드값
CHAR(숫자) 65 'A' 코드값 → 문자
※ 문자 정렬 순서나 대소문자 비교 로직을 직접 다뤄야 할 때, 또는 코드값 기준으로 문자를 생성해야 할 때 이 두 함수가 쓰인다. CASE와는 별개의 문자열/코드 처리 함수지만, 오늘 코드처럼 같은 SELECT 문에서 자주 함께 등장한다.

8 자주 하는 실수
실수 증상 해결
END을 빠뜨림 SQL 문법 오류 (구문 파싱 실패) CASE를 열었으면 반드시 END로 닫기
ELSE를 생략 매칭 안 되면 조용히 NULL 반환 예상 밖 값 대비용 ELSE를 습관적으로 작성
단순 CASE에 부등호 조건 시도 문법 오류 또는 의도와 다른 결과 범위·부등호 비교는 검색 CASE로 전환
검색 CASE에서 조건 순서를 넓은 것부터 배치 뒤의 좁은 조건이 절대 실행되지 않음 좁은 조건을 위, 넓은 조건을 아래로
CASE 결과에 AS 별칭을 안 붙임 컬럼명이 CASE ... END처럼 지저분하게 나옴 END AS 별칭으로 이름 지정
ASCII/CHAR 인자 타입 착각 ASCII에 여러 글자, CHAR에 문자 전달 등으로 의도와 다른 결과 ASCII는 문자(맨 앞 글자만), CHAR는 숫자 코드값을 인자로

핵심 한 줄 요약

CASE 값 WHEN … END값 하나를 순서대로 비교해 첫 매칭 결과 반환
단순 CASE동등 비교(=)만 — CASE 뒤에 기준값 하나
검색 CASE부등호·범위 비교 가능 — WHEN마다 독립 조건식
평가 순서위에서 아래로, 처음 참인 WHEN에서 즉시 종료
ELSE 생략매칭 없으면 NULL — 항상 넣는 습관 권장
활용처SELECT 컬럼 가공, ORDER BY 커스텀 정렬 등
ASCII / CHAR문자 ↔ 코드값 상호 변환 (서로의 역함수)

Tags

#MySQL #CASE WHEN #THEN #ELSE #END #조건분기 #다중조건 #단순CASE #검색CASE #ASCII #CHAR #SQL #데이터베이스 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, CASE WHEN, THEN, ELSE, END, 조건분기, 다중조건, 단순CASE, 검색CASE, ASCII, CHAR, SQL, 데이터베이스, 웹개발, 티스토리
반응형

댓글