SQL Case
SQL CASE: 조건에 따라 값을 반환하는 조건문
SQL CASE 문은 조건에 따라 다른 값을 반환하거나 특정 논리적 처리를 수행할 수 있게 해주는 조건문입니다. CASE는 SQL에서 IF-ELSE와 비슷한 역할을 하며, 주로 SELECT 문에서 조건에 따라 데이터를 변환하거나 새로운 값을 반환하는 데 사용됩니다.
1. 기본 CASE 문법
SELECT CASE
WHEN 조건1 THEN 반환값1
WHEN 조건2 THEN 반환값2
...
ELSE 기본반환값
END AS 별칭
FROM 테이블이름;
- WHEN 조건: 각 조건을 평가합니다.
- THEN 반환값: 조건이 TRUE일 때 반환할 값을 지정합니다.
- ELSE: 모든 조건이 FALSE일 때 반환할 기본값입니다. ELSE는 선택 사항이며, 생략할 수 있습니다.
- END: CASE 문을 종료합니다.
- AS 별칭: CASE 문으로 만들어진 결과 열에 이름을 지정합니다.
2. SQL CASE 예제
2.1 부서에 따른 메시지 반환
다음은 employees
테이블에서 부서에 따라 메시지를 반환하는 예제입니다.
SELECT name,
CASE
WHEN department = 'Sales' THEN 'Sales Team'
WHEN department = 'HR' THEN 'HR Team'
ELSE 'Other Department'
END AS department_message
FROM employees;
이 쿼리는 부서에 따라 Sales, HR 부서의 직원에게 특정 메시지를 반환하고, 나머지는 Other Department로 표시합니다.
결과 예시:
name | department_message |
---|---|
John | Sales Team |
Jane | HR Team |
Alice | Other Department |
2.2 급여에 따른 등급 분류
다음은 급여에 따라 직원의 급여 등급을 분류하는 예제입니다.
SELECT name, salary,
CASE
WHEN salary > 7000 THEN 'High'
WHEN salary BETWEEN 4000 AND 7000 THEN 'Medium'
ELSE 'Low'
END AS salary_grade
FROM employees;
이 쿼리는 salary 값을 기준으로 급여를 High, Medium, Low 등급으로 분류합니다.
결과 예시:
name | salary | salary_grade |
---|---|---|
John | 8000 | High |
Jane | 6000 | Medium |
Alice | 3000 | Low |
3. CASE와 집계 함수 결합
CASE 문은 집계 함수와 결합하여 특정 조건에 따라 데이터를 그룹화하거나 계산할 수 있습니다.
예제: 특정 부서의 직원 수 계산
다음은 Sales 부서와 HR 부서의 직원 수를 계산하는 예제입니다.
SELECT department,
COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count,
COUNT(CASE WHEN department = 'HR' THEN 1 END) AS hr_count
FROM employees
GROUP BY department;
이 쿼리는 부서별로 Sales 부서와 HR 부서의 직원 수를 계산하여 반환합니다.
결과 예시:
department | sales_count | hr_count |
---|---|---|
Sales | 3 | 0 |
HR | 0 | 2 |
Engineering | 0 | 0 |
4. CASE와 ORDER BY 결합
CASE 문은 ORDER BY 절에서 사용되어, 조건에 따라 데이터를 특정 순서로 정렬할 수 있습니다.
예제: 급여 등급에 따라 정렬
다음은 급여 등급을 기준으로 직원 데이터를 정렬하는 예제입니다.
SELECT name, salary,
CASE
WHEN salary > 7000 THEN 'High'
WHEN salary BETWEEN 4000 AND 7000 THEN 'Medium'
ELSE 'Low'
END AS salary_grade
FROM employees
ORDER BY CASE
WHEN salary > 7000 THEN 1
WHEN salary BETWEEN 4000 AND 7000 THEN 2
ELSE 3
END;
이 쿼리는 급여 등급이 High, Medium, Low 순으로 데이터를 정렬합니다.
결과 예시:
name | salary | salary_grade |
---|---|---|
John | 8000 | High |
Jane | 6000 | Medium |
Alice | 3000 | Low |
5. CASE와 UPDATE 결합
CASE 문은 UPDATE 문에서 특정 조건에 따라 값을 수정할 때 사용할 수 있습니다.
예제: 급여에 따라 보너스 수정
다음은 급여 등급에 따라 보너스를 수정하는 예제입니다.
UPDATE employees
SET bonus = CASE
WHEN salary > 7000 THEN 1000
WHEN salary BETWEEN 4000 AND 7000 THEN 500
ELSE 100
END;
이 쿼리는 급여 등급에 따라 보너스를 설정합니다.
결과 예시:
name | salary | bonus |
---|---|---|
John | 8000 | 1000 |
Jane | 6000 | 500 |
Alice | 3000 | 100 |
6. CASE와 NULL 값 처리
CASE 문을 사용하여 NULL 값을 처리할 수 있습니다. COALESCE() 함수와 유사한 방식으로 NULL 값을 특정 값으로 대체할 수 있습니다.
예제: NULL 값을 'Unknown'으로 처리
다음은 department 열의 NULL 값을 'Unknown'
으로 처리하는 예제입니다.
SELECT name,
CASE
WHEN department IS NULL THEN 'Unknown'
ELSE department
END AS department_name
FROM employees;
이 쿼리는 department가 NULL인 경우 **'Unknown'**을 반환합니다.
결과 예시:
name | department_name |
---|---|
John | Sales |
Jane | HR |
Bob | Unknown |
7. 중첩 CASE 문
CASE 문은 중첩될 수 있습니다. 즉, 하나의 CASE 문 안에 또 다른 CASE 문을 사용할 수 있습니다.
예제: 중첩된 CASE 문 사용
다음은 부서와 급여에 따라 등급을 다르게 설정하는 중첩된 CASE 문입니다.
SELECT name,
CASE
WHEN department = 'Sales' THEN
CASE
WHEN salary > 7000 THEN 'High Sales'
ELSE 'Low Sales'
END
WHEN department = 'HR' THEN
CASE
WHEN salary > 5000 THEN 'High HR'
ELSE 'Low HR'
END
ELSE 'Other Department'
END AS grade
FROM employees;
이 쿼리는 부서와 급여에 따라 Sales와 HR 부서의 직원을 각각 다른 방식으로 분류합니다.
결과 예시:
name | grade |
---|---|
John | High Sales |
Jane | High HR |
Alice | Other Department |
8. CASE와 성능 고려
CASE 문은 복잡한 논리를 단순화하고, 데이터를 변환하는 데 매우 유용하지만, 조건이 많아지면 성능에 영향을 미칠 수 있습니다. 복잡한 로직을 처리해야 할 때는 조건을 적절히 최적화하는 것이 중요합니다. 특히 많은 WHEN 절이 있을 경우 쿼리 성능을 고려해야 합니다.
9. 실전 예제
예제 1: 특정 부서의 급여 등급 분류
SELECT name, salary,
CASE
WHEN department = 'Sales' AND salary > 5000 THEN 'High Sales'
WHEN department = 'HR' AND salary > 5000 THEN 'High HR'
ELSE 'Other'
END AS grade
FROM employees;
예제 2: 급여 등급에 따라 보너스 수정
UPDATE employees
SET bonus = CASE
WHEN salary > 7000 THEN 1000
WHEN salary BETWEEN 4000 AND 7000 THEN 500
ELSE 100
END;
예제 3: NULL 값을 처리하여 부서명 출력
SELECT name,
CASE
WHEN department IS NULL THEN 'Unknown'
ELSE department
END AS department_name
FROM employees;
10. 요약
- SQL CASE 문은 조건에 따라 다른 값을 반환하거나, 특정 논리를 처리할 수 있는 조건문입니다.
- 주로 SELECT 문에서 조건에 따라 데이터를 변환하거나, 집계 함수와 결합하여 특정 데이터를 분석할 때 사용됩니다.
UPDATE 문에서도 사용할 수 있어, 조건에 따라 데이터를 수정할 수 있습니다.
- NULL 값을 처리하거나, ORDER BY, GROUP BY와 함께 사용할 수 있습니다.
- 복잡한 CASE 문이 많아질수록 성능에 영향을 미칠 수 있으므로, 적절한 최적화를 고려해야 합니다.