SQL은 단순한 데이터 조회에서 끝나지 않는다. 때로는 값에 따라 다른 결과를 출력하고, NULL 값을 대체하고, 조건별로 통계를 나누는 등의 조건 분기 처리가 필요하다. 이때 사용하는 것이 바로 CASE, IF, COALESCE, NULLIF와 같은 조건 함수들이다. 이 글에서는 이 함수들의 정확한 쓰임새와 차이점, 그리고 실무에서 자주 쓰이는 예제들을 단계별로 정리해본다.
1. CASE 문: SQL의 if-else 문
1-1. CASE의 기본 구조
CASE는 SQL에서 가장 강력한 조건 분기 도구이다. IF-ELSE 문처럼 조건을 순차적으로 검사해 결과를 출력하며, SELECT, WHERE, ORDER BY, GROUP BY, HAVING 등 거의 모든 위치에서 사용할 수 있다.
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
ELSE 기본값
END
1-2. 예시: 회원 등급에 따라 등급명 표시
SELECT name,
CASE
WHEN point >= 1000 THEN 'VIP'
WHEN point >= 500 THEN 'GOLD'
ELSE 'BASIC'
END AS grade
FROM users;
→ 점수에 따라 각기 다른 문자열 출력
1-3. 조건이 아닌 값 분기 방식
CASE status
WHEN 'WAIT' THEN '대기'
WHEN 'COMPLETE' THEN '완료'
ELSE '기타'
END
→ status 값 자체를 기준으로 분기 처리
2. IF 함수: 간단한 2분기 처리
2-1. IF 함수의 구조
MySQL 등에서 지원하는 IF() 함수는 간단한 참/거짓 조건에 따라 두 값을 분기하는 데 사용된다. 삼항 연산자와 유사하다.
IF(조건, 참일 때 값, 거짓일 때 값)
2-2. 예시: 로그인 상태 표현
SELECT name, IF(is_active = 1, '활성', '비활성') AS 상태
FROM users;
→ is_active가 1이면 '활성', 아니면 '비활성'
2-3. 실무 사용 시 유의점
- IF()는 단일 조건만 처리할 때 빠르고 간결하다.
- 복잡한 분기(3개 이상)는 CASE가 더 적합하다.
3. COALESCE 함수: NULL을 다른 값으로 대체
3-1. COALESCE란?
COALESCE()는 여러 값을 순서대로 검사하여 NULL이 아닌 첫 번째 값을 반환한다. NULL 처리에 특화된 함수이며, IFNULL()보다 더 범용적이다.
COALESCE(값1, 값2, ..., 기본값)
3-2. 예시: 닉네임 없으면 이름 출력
SELECT COALESCE(nickname, name) AS display_name
FROM users;
→ 닉네임이 NULL이면 name을 대신 출력
3-3. 다중 값 처리
COALESCE(address_detail, address_main, '주소 없음')
→ 주소 상세, 기본 주소 중 하나라도 있으면 출력, 둘 다 NULL이면 '주소 없음'
4. NULLIF 함수: 두 값이 같으면 NULL 반환
4-1. NULLIF란?
NULLIF(a, b)는 두 값이 같으면 NULL을, 다르면 a를 그대로 반환한다. 주로 나누기 연산에서 0 나누기 오류를 방지하거나, 특정 값을 제거할 때 사용된다.
SELECT NULLIF(score, 0)
→ score가 0이면 NULL 반환
4-2. 예시: 0점은 출력하지 않기
SELECT name, NULLIF(score, 0) AS filtered_score
FROM users;
→ 점수가 0인 경우 빈값으로 표시되고, 그 외는 점수 출력
5. 조건 처리 함수들의 실무 비교
기능/조건 | CASE | IF | COALESCE | NULLIF |
다중 조건 분기 | O | X | X | X |
단일 조건 참/거짓 | O | O | X | X |
NULL 대체 | △ | △ | O | O |
특정 값만 NULL 처리 | △ | X | △ | O |
- 복잡한 분기 로직 → CASE
- 단순 2분기 → IF
- NULL 값을 기본값으로 대체 → COALESCE
- 특정 조건만 NULL로 만들고 싶을 때 → NULLIF
6. 조건 함수 실무 예제 모음
6-1. 고객 등급별 혜택 표시
SELECT name,
CASE
WHEN point >= 1000 THEN '무료배송 + 쿠폰'
WHEN point >= 500 THEN '쿠폰'
ELSE '일반회원'
END AS benefit
FROM users;
6-2. 주소 정보 구성
SELECT CONCAT_WS(' ', address_city, address_district,
COALESCE(address_detail, '상세주소 없음')) AS full_address
FROM users;
6-3. 활동 여부 상태 표시
SELECT name, IF(last_login >= CURDATE() - INTERVAL 30 DAY, '최근 접속', '미접속') AS status
FROM users;
6-4. 0을 NULL로 바꿔서 계산 오류 방지
SELECT name, total_sales / NULLIF(order_count, 0) AS avg_sale
FROM sales_summary;
7. 조건 함수와 정렬(ORDER BY)의 결합
7-1. 조건 분기 + 정렬
ORDER BY 절 안에서도 CASE 또는 IF를 사용할 수 있다. 특정 조건을 만족하는 데이터를 먼저 정렬하거나, 사용자 정의 기준으로 정렬할 때 유용하다.
7-2. 예시: VIP 고객을 위로 정렬
SELECT name, point
FROM users
ORDER BY
CASE
WHEN point >= 1000 THEN 1
WHEN point >= 500 THEN 2
ELSE 3
END;
→ CASE 문으로 점수에 따라 정렬 우선순위를 조정
7-3. 예시: NULL 값을 뒤로 보내기
SELECT name, updated_at
FROM posts
ORDER BY
CASE WHEN updated_at IS NULL THEN 1 ELSE 0 END,
updated_at DESC;
→ 최근 수정된 글은 위로, 수정일 없는 글은 아래로 정렬
8. 조건 함수와 그룹화(GROUP BY)의 조합
8-1. CASE와 GROUP BY의 결합
조건 함수를 GROUP BY나 COUNT, SUM 등 집계 함수와 함께 사용하면 조건별 통계를 만들 수 있다.
8-2. 예시: 등급별 회원 수 통계
SELECT
CASE
WHEN point >= 1000 THEN 'VIP'
WHEN point >= 500 THEN 'GOLD'
ELSE 'BASIC'
END AS grade,
COUNT(*) AS user_count
FROM users
GROUP BY grade;
→ CASE로 등급을 나누고, 각 등급별 사용자 수를 집계
8-3. 예시: 배송상태별 주문 건수
SELECT
IF(status = 'DELIVERED', '완료', '진행중') AS 배송상태,
COUNT(*) AS 건수
FROM orders
GROUP BY 배송상태;
→ IF()를 사용한 단순 그룹화도 가능
9. 조건 함수와 사용자 화면(UI) 표현
9-1. 숫자 대신 문구 보여주기
SELECT name,
IF(is_banned = 1, '정지됨', '정상') AS 상태
FROM users;
→ 관리자 화면에서 숫자 상태값을 사람이 읽기 쉬운 형태로 표현
9-2. 조건별 색상 클래스 부여 예시
SELECT name,
CASE
WHEN score >= 90 THEN 'score-high'
WHEN score >= 70 THEN 'score-mid'
ELSE 'score-low'
END AS css_class
FROM students;
→ 웹 화면에서 각 점수대에 따라 다른 색상 표시를 할 수 있도록 처리
9-3. NULL 처리로 로딩 오류 방지
SELECT name, COALESCE(profile_image, 'default.png') AS image
FROM users;
→ 이미지 경로가 없는 경우 기본 이미지 출력
10. 주의사항과 팁
- CASE는 복잡할수록 들여쓰기와 가독성에 신경 써야 한다.
- IF()는 MySQL 전용 문법으로, Oracle 등에서는 사용할 수 없다.
- COALESCE()는 SELECT뿐 아니라 GROUP BY, ORDER BY에서도 유용하다.
- NULLIF()는 나눗셈 연산 또는 중복 제거용 서브 조건 처리에 매우 강력하다.
'컴퓨터공학' 카테고리의 다른 글
SQL 데이터 타입과 제약 조건 완전 정복: 테이블 설계의 기본기 (0) | 2025.05.14 |
---|---|
SQL 정렬과 페이징 처리 완전 정복: 성능과 UX를 모두 고려한 설계 (0) | 2025.05.14 |
SQL JOIN 완전 정복: 테이블을 연결하는 진짜 기술 (0) | 2025.04.03 |
SQL 집계 함수와 GROUP BY 완전 정복: 데이터 요약의 기술 (0) | 2025.04.03 |
SQL 조건문 완전 정복: WHERE, LIKE, IN, BETWEEN, IS NULL, 비교연산자 (0) | 2025.03.29 |