SQL Server에서 쿼리문 작성시 IF문을 종종 사용한다.
하지만 SELECT문 안에서는 IF문을 사용할 수가 없어 답답한 경우가 많다.
SQL Server에서는 SELECT문에서 IF문을 사용할 수 없는 대신 CASE문을 제공하고 있다. CASE문을 사용하면 SELECT문안에서도 IF문의 효과를 누릴 수 있다.
CASE 함수는 다중 IF문과 같은 구조를 가진다. 더불어 SELECT 구문 같은 DML과 연동을 해서 행 단위의 조건 처리가 가능하다는 특징을 가지고 있기 때문에 복잡한 쿼리 작성 시에 필수적으로 사용된다.
기본적인 구문>
1. CASE 함수는 지정된 조건식을 평가하고, 조건에 만족하는 결과 중 하나를 리턴한다.
2. CASE 함수는 다음과 같은 항목들로 구성된다.
CASE 키워드
변환할 열 이름
검색할 식을 지정하는 WHEN절 및 이를 바꿀 식을 지정하는 THEN 절
END 키워드
CASE 함수의 별칭을 정의하는 선택적 AS 절
형식별 CASE 함수>
1. 단순 CASE 함수
- 조건식이 한 번만 지정되고 WHEN절에는 조건식과 비교할 상수값만 선언한다. 각각의 WHEN절을 비교해 조건에 만족하면 THEN절 다음의 구문이 실행된다.
syntax 1.
CASE input_expression!
WHEN when_expressionŋ THEN result_expressionŋ
WHEN when_expressionŌ THEN result_expressionŌ
[ ...n ]
[ ELSE else_result_expression! ]
END
2. 검색된 CASE 함수 (CASE 절에는 아무런 조건식도 오지 않는다)
- 각 WHEN절에 필요한 조건식을 별도로 지정할 수 있다.조건이 만족하면 THEN절 다음에 명령이 실행된다.
syntax 2.
CASE
WHEN Boolean_expressionŋ THEN result_expressionŋ
WHEN Boolean_expressionŌ THEN result_expressionŌ
[ ...n ]
[ ELSE else_result_expression! ]
END
NOTE: THEN절 다음에는 일반 상수값 뿐만 아니라 함수나 심지어 또 다른 쿼리문이 올 수도 있다. 반드시 잊지 말 것은 result_expression!은 반드시 하나의 값을 리턴해야 한다는 것이다. 하지만 행 단위로 각각의 검색 조건이 반복 실행되므로, 성능에 관한한 최상의 결과를 얻기는 힘들다.
예제>
- 여기서 CASE문은 컬럼에 표시할 때 조건에 따라 다르게 표시하도록 조건을 줄 때 사용하였다.
SELECT [Name], SocID, PayFlag, PayDate, SUM(PayAmount) AS PayAmount
FROM (
SELECT P.[Name] AS [Name], P.SocID AS SocID, AP.PayFlag, CONVERT(VARCHAR(10), AP.UserPayDate, 121) AS PayDate,
(CASE
WHEN (AP.Cash+AP.Card) < AP.Cost03 THEN (AP.Cash+AP.Card)-AP.Cost01
WHEN (AP.Cash+AP.Card) >= AP.Cost03 THEN AP.Cost03
END) AS PayAmount
FROM xdo_AccountPay AP
INNER JOIN xdo_Account A ON A.AccountID = AP.AccountID
INNER JOIN xdo_Patient P ON P.PatientID = A.PatientID
WHERE AP.Cost03 > 0
AND (CONVERT(VARCHAR(10), AP.UserPayDate, 121) BETWEEN @csBeginPayDate AND @csEndPayDate)
AND AP.PayFlag = 9
) AS SUBMAIN
GROUP BY [Name], SocID, PayFlag, PayDate
ORDER BY PayDate
CASE를 사용한 조건 데이터 처리>
- 실제로 CASE문을 필요로 하는 것은 바로 DML 명령들이다. select 구문을 처리되는 집합 중 특정 컬럼값에 기초한 조건을 기준으로 테이블에는 없지만 새로운 집합에 포함돼야 할 컬럼을 새로 생성하고, 그 컬럼값을 추출, 가공, 연산하는 용도로 곧잘 사용된다. 즉 select되는 각각의 행(row, record)에 대해 조건을 부여하고 조건에 만족하는 결과를 새로운 컬럼값에 할당하는 것이다. CASE문을 조건 데이터 처리와 함께 사용한 경우에 두 가지 특징을 볼 수 있다.
CASE의 특징
1. 행 단위의 조건 처리가 가능
2. 새로운 컬럼 생성
CASE 함수는 다양한 상황의 문제 해결에 활용될 수 있다. 참고로 T-SQL에는 CASE와 유사한 COALESCE()함수가 있다.