본문 바로가기
  • [성공하는 개발자] - Developer
DataBase/MSSQL

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

by Sein-JH 2022. 7. 25.
728x90

 

SQL Server에서는 조건에 따라 서로 다른 값을 반환할 수 있는 CASE 표현식을 사용할 수 있다. 프로그래밍 언어에서 if 문과 비슷하다고 생각하면 된다. 오라클의 DECODE 함수와 비슷한 기능을 하며, CASE 표현식은 ANSI SQL 이므로 대부분의 데이터베이스에서 동일하게 사용할 수 있다.

 

 

CASE 표현식은 if 문 방식과 swith 문 방식으로 사용할 수 있다. 주로 if 문과 유사한 방식으로 많이 사용하지만 상황에 따라서 swith 문 방식으로 사용하면 쿼리문을 단순화시킬 수도 있을 듯하다.

 

기본 사용법

■ if 문 방식

ELECT 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)

 

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

 

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

 

 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

 

switch 문 방식은 조건을 부여할 수는 없고 컬럼의 값만 체크하여 값을 반환할 때 사용한다. 자주 사용은 안 하지만 알아두면 좋을 듯하다.

 

고급 사용법

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

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)

 

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

 

 WHERE 절에 사용하는 방법

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

 

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

 

 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)

 

CASE 표현식은 중첩해서 사용할 수 있으며, 중첩해서 사용할 경우 쿼리 문의 가독성이 떨어질 수 있으므로 주의해서 사용해야 한다.

참조 : https://gent.tistory.com/435?category=874679

댓글