[SQL 코어 파헤치기] 다중 조건 분기 처리 완벽 해부 - CASE WHEN, IF, IFNULL

이성진·2026년 4월 1일

프로그래머스 SQL

목록 보기
6/7

알고리즘 문제를 풀다가 SQL을 처음 접하면 가장 당황스러운 순간이 바로 "값을 직접 비교하고 대입하는 과정(할당, =)이 없다"는 점이다.

C++, Python, Java와 같은 언어에서는 for문으로 배열을 순회하며 if-else로 값을 변수에 대입하는 절차적(Imperative) 사고방식에 익숙해져 있다. 하지만 SQL은 데이터를 어떻게 처리할지 명시하는 것이 아니라, 결과적으로 무엇을 가져올지 선언하는 선언적(Declarative) 언어다.

따라서 원본 데이터를 변형하거나 변수에 값을 할당하는 대신, 전체 데이터 셋을 펼쳐놓고 조건에 맞는 새로운 파생 컬럼(Column)을 통째로 만들어낸다는 시각의 전환이 필요하다.

이번 글에서는 코딩테스트 SQL 문제에서 조건 분기를 처리할 때 반드시 알아야 할 3가지 핵심 무기를 해부해 본다.


1. 표준적이고 가장 강력한 무기: CASE WHEN

파이썬의 if - elif - else 구조를 SQL의 컬럼으로 투영해 내는 구문이다. 복잡한 다중 조건을 처리할 때 가장 많이 사용된다.

💡 기본 문법

CASE 
    WHEN 조건1 THEN 반환값1
    WHEN 조건2 THEN 반환값2
    ELSE 모든 조건에 맞지 않을 때 반환값 (생략 시 NULL)
END AS 새로운_컬럼명

🔍 구조 파헤치기: ENDAS의 역할

  • END (필수): CASE 문의 끝을 알리는 '닫는 괄호' 역할을 한다. 프로그래밍 언어에서 if { ... }의 닫는 중괄호(})와 같다. END가 없으면 문법 에러가 발생한다.
  • AS 새로운_컬럼명 (선택이나 필수 권장): AS는 계산된 결과가 들어갈 컬럼의 이름(별칭, Alias)을 지정해 준다. 생략할 경우 쿼리 실행 결과의 헤더(컬럼명)가 CASE WHEN... 구문 전체로 지저분하게 출력되므로, 가독성을 위해 반드시 명시하는 것이 좋다.

💻 실전 적용 예시

회원의 누적 구매 금액(TOTAL_PRICE)에 따라 VIP, GOLD, SILVER 등급을 부여하는 경우를 생각해보자.

SELECT 
    MEMBER_ID,
    TOTAL_PRICE,
    CASE 
        WHEN TOTAL_PRICE >= 100000 THEN 'VIP'
        WHEN TOTAL_PRICE >= 50000 THEN 'GOLD'
        ELSE 'SILVER'
    END AS MEMBER_GRADE
FROM 
    PURCHASE_HISTORY;

핵심 포인트: 변수에 'VIP'를 대입하는 것이 아니다! SELECT 조회 결과물에 MEMBER_GRADE라는 가상의 열을 하나 더 생성하여, 각 행의 조건에 맞는 텍스트를 출력하게 하는 것이다.


2. 단일 조건의 치트키: IF 함수 (MySQL 특화)

조건이 단순히 참(True)/거짓(False) 두 가지로만 나뉠 때는 CASE WHEN보다 삼항 연산자처럼 쓸 수 있는 IF 함수가 훨씬 간결하고 강력하다. 프로그래머스 코딩테스트 환경(MySQL)에서 유용하게 쓰인다.

💡 기본 문법

IF(조건, 참일 때 반환값, 거짓일 때 반환값) AS 새로운_컬럼명

💻 실전 적용 예시

중고거래 게시판에서 상태(STATUS)가 'SALE'이면 '판매중', 그 외의 경우 '판매완료'로 출력해야 하는 경우다.

SELECT 
    BOARD_ID,
    TITLE,
    IF(STATUS = 'SALE', '판매중', '판매완료') AS STATUS_KOR
FROM 
    USED_GOODS_BOARD;

3. NULL 값 처리의 스페셜리스트: IFNULL

코딩테스트에서 값을 직접 "대입"하고 싶게 만드는 가장 큰 원인은 바로 비어있는 NULL 데이터다. NULL 값을 다른 문자열이나 숫자로 대체하고 싶을 때는 IFNULL (또는 COALESCE)을 사용한다.

💡 기본 문법

IFNULL(검사할_컬럼, NULL일_때_대체할_값) AS 컬럼명

💻 실전 적용 예시

이름(NAME)이 없는 동물의 이름을 "No name"으로 대체해서 출력해야 하는 경우다.

SELECT 
    ANIMAL_ID,
    IFNULL(NAME, 'No name') AS NAME
FROM 
    ANIMAL_INS;

🚀 요약 (Cheat Sheet)

상황사용 구문특징
다중 조건 (3개 이상)CASE WHEN ... THEN ... END범용적 표준 SQL, 다중 분기 처리에 최적화
단일 조건 (참/거짓)IF(조건, 참, 거짓)MySQL 지원, 삼항 연산자처럼 빠르고 간결함
NULL 데이터 대체IFNULL(컬럼, 대체값)NULL 값에 대한 디폴트 값 매핑 시 필수 사용

SQL 문제를 마주했을 때는 "원본 데이터를 수정하는 것이 아니라, 도화지(SELECT) 위에 내가 원하는 형태의 새로운 열(Column)을 그려낸다"고 시각화하자. 이 감각만 익히면 복잡한 코딩테스트 SQL 문제도 알고리즘처럼 명쾌하게 풀이할 수 있다!

profile
알고리즘과 cs지식 학습

0개의 댓글