코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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;

이 쿼리는 departmentNULL인 경우 **'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;

이 쿼리는 부서와 급여에 따라 SalesHR 부서의 직원을 각각 다른 방식으로 분류합니다.

결과 예시:

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 문이 많아질수록 성능에 영향을 미칠 수 있으므로, 적절한 최적화를 고려해야 합니다.

copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com