[MSSQL] CASE WHEN 표현식 사용법 (DECODE, IF)
- 데이터베이스/MSSQL
- 2021. 9. 3.
SQL Server에서는 조건에 따라 서로 다른 값을 반환할 수 있는 CASE 표현식을 사용할 수 있다. 프로그래밍 언어에서 if 문과 비슷하다고 생각하면 된다. 오라클의 DECODE 함수와 비슷한 기능을 하며, CASE 표현식은 ANSI SQL 이므로 대부분의 데이터베이스에서 동일하게 사용할 수 있다.
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 표현식은 중첩해서 사용할 수 있으며, 중첩해서 사용할 경우 쿼리 문의 가독성이 떨어질 수 있으므로 주의해서 사용해야 한다.