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

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

 

MSSQL CASE 표현식

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

 

기본 사용법

if 문 방식

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)

 

 

비교 연산자 (>, <, =, <>), 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 표현식은 중첩해서 사용할 수 있으며, 중첩해서 사용할 경우 쿼리 문의 가독성이 떨어질 수 있으므로 주의해서 사용해야 한다.

 

 

[MSSQL] IIF 함수 사용법 (CASE, DECODE)

SQL Server 2012 버전부터 IIF 함수가 추가되었다. CASE 문을 사용하면 쿼리문이 조금 복잡해지는 부분이 있는데 2가지의 값만 리턴이 필요하다면 IIF 함수가 조금 더 효율적일 수 있다. 오라클의 DECODE

gent.tistory.com

 

[MSSQL] ISNULL 함수 사용법 (NVL, NVL2, IFNULL)

SQL Server에서는 NULL 값을 치환하기 위해서는 ISNULL 함수를 사용한다. 오라클에서 NVL 함수와 MySQL의 IFNULL 함수와 동일한 기능을 수행한다. 오라클의 NVL2와 동일한 함수는 없지만, IIF 함수 또는 CASE

gent.tistory.com

 

 

댓글

Designed by JB FACTORY