프로그래밍 언어/SQL

[SQL] CASE WHEN 표현식 사용법 (DECODE, IF)

ShovelingLife 2024. 8. 21. 20:38

 

기본 사용법

if문 방식

비교 연산자 (>,<,=,<>), NULL 연산자 (IS NULL, IS NOT NULL)을 사용하여 조건을 부여할 수 있으며, 논리 연산자 (AND, OR)를 사용하여 여러 개의조건을 부여할 수 있다.

ELSE 부분은 생략이 가능하며 생략할 경우 조건에 맞지 않으면 NULL을 반환한다.

SELECT employee_id
     , first_name
     , job_id
     , CASE WHEN job_id = 13 THEN 'CLERK'
            WHEN job_id = 14 THEN 'MANAGER'
            ELSE 'N/A'
       END AS [job_title]
  FROM employees
 WHERe department_id IN (1, 3)

 

switch문 방식

SELECT employee_id
     , first_name
     , CASE job_id
            WHEN 13 THEN 'CLERK'
            WHEN 14 THEN 'MANAGER'
            ELSE 'N/A'
       END AS [job_title]
  FROM employees
 WHERE department_id = 3

고급 사용법

조건을 여러 개 부여하는 방법

논리 연산자 (AND, OR)를 사용하여 여러 개의 조건을 조합해서 사용할 수 있다.

SELECT employee_id
     , first_name
     , job_id
     , CASE WHEN department_id = 3 AND job_id = 13 THEN 'CLERK'
            WHEN department_id = 3 AND job_id = 14 THEN 'MANAGER'
       END AS [job_title]
  FROM employees
 WHERE department_id IN (1, 3)

 

WHERE 절에 사용하는 방법

WHERE 절에도 CASE 표현식을 사용할 수 있다. 인덱스 컬럼에 CASE 표현식 사용하면 쿼리 문의 속도에 영향을 미치므로 주의해야 한다. 단순 필터링 용도로만 사용해야 한다.

SELECT employee_id
     , first_name
     , job_id
     , salary
  FROM employees
 WHERE department_id IN (1, 3)
   AND (CASE WHEN salary >= 4000 THEN 1
             WHEN salary >= 3000 THEN 2
             WHEN salary >= 2000 THEN 3
       END) = 1

 

CASE 표현식을 중첩으로 사용하는 방법

중첩해서 사용할 경우 쿼리 문의 가독성이 떨어질 수 있으므로 주의해서 사용해야한다

SELECT employee_id
     , first_name
     , department_id
     , salary
     , CASE department_id
            WHEN 1 THEN
                 CASE WHEN salary >= 4000 THEN '1등급'
                      WHEN salary >= 3000 THEN '2등급'
                      WHEN salary >= 2000 THEN '3등급'
                 END
            WHEN 3 THEN
                 CASE WHEN salary >= 4000 THEN '1등급'
                      WHEN salary >= 3000 THEN '2등급'
                      WHEN salary >= 2000 THEN '3등급'
                 END
       END AS [salary_grade] 
  FROM employees
 WHERE department_id IN (1, 3)

 

출처