CASE(Transact-SQL)
업데이트: 2006년 4월 14일
조건 목록을 평가하고 가능한 여러 결과 식 중 하나를 반환합니다.
CASE 식에는 두 가지 형식이 있습니다.
- 단순 CASE 식은 특정 식을 일련의 단순 식과 비교하여 결과를 결정합니다.
- 검색된 CASE 식은 일련의 부울 식을 평가하여 결과를 결정합니다.
두 가지 형식 모두 선택 사항인 ELSE 인수를 지원합니다.
CASE는 유효한 식이 허용되는 모든 문 또는 절에서 사용할 수 있습니다. 예를 들어 SELECT, UPDATE, DELETE, SET 등의 문과 select_list, IN, WHERE, ORDER BY, HAVING 등의 절에서 CASE를 사용할 수 있습니다.
구문
Simple CASE expression:
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Searched CASE expression:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
인수
- input_expression
단순 CASE 형식을 사용할 때 평가되는 식입니다. input_expression은 유효한 식입니다.
- WHEN when_expression
단순 CASE 형식을 사용할 때 input_expression과 비교되는 단순 식입니다. when_expression은 유효한 식입니다. input_expression과 각 when_expression의 데이터 형식은 동일하거나 암시적으로 변환되어야 합니다.
- THEN result_expression
input_expression이 when_expression과 같거나 Boolean_expression이 TRUE인 경우에 반환되는 식입니다. result expression은 유효한 식입니다.
- ELSE else_result_expression
TRUE로 평가된 비교 연산이 없을 때 반환되는 식입니다. 이 인수가 생략되고 TRUE로 평가된 비교 연산이 없는 경우 CASE는 NULL을 반환합니다. else_result_expression은 유효한 식입니다. else_result_expression과 result_expression의 데이터 형식은 동일하거나 암시적으로 변환되어야 합니다.
- WHEN Boolean_expression
검색된 CASE 형식을 사용할 때 평가되는 부울 식입니다. Boolean_expression은 유효한 부울 식입니다.
주의
SQL Server에서는 CASE 식의 중첩을 10개 수준까지만 허용합니다.
CASE 식은 Transact-SQL 문, 문 블록, 사용자 정의 함수 및 저장 프로시저의 실행 흐름을 제어하는 데 사용할 수 없습니다. 흐름 제어 메서드 목록을 보려면 흐름 제어 언어(Transact-SQL)를 참조하십시오.
결과 유형
result_expressions와 선택 사항인 else_result_expression의 형식 집합에서 우선 순위가 가장 높은 형식을 반환합니다. 자세한 내용은 데이터 형식 우선 순위(Transact-SQL)를 참조하십시오.
결과 값
간단한 CASE 식:
간단한 CASE 식은 첫 번째 식을 각 WHEN 절의 식과 같은지 비교하는 방식으로 작동합니다. 이러한 식이 같으면 THEN 절의 식이 반환됩니다.
- 동등성 검사만 수행할 수 있습니다.
- input_expression을 평가한 다음 지정된 순서대로 각 WHEN 절에 대해 input_expression = when_expression을 평가합니다.
- 먼저 TRUE로 평가된 input_expression = when_expression의 result_expression을 반환합니다.
- TRUE로 평가된 input_expression = when_expression이 없으면 SQL Server 데이터베이스 엔진에서 ELSE 절이 지정된 경우 else_result_expression을 반환하고 ELSE 절이 지정되지 않은 경우 NULL 값을 반환합니다.
검색된 CASE 식:
- 지정된 순서대로 각 WHEN 절에 대해 Boolean_expression을 평가합니다.
- 먼저 TRUE로 평가된 Boolean_expression의 result_expression을 반환합니다.
- TRUE로 평가된 Boolean_expression이 없으면 데이터베이스 엔진에서 ELSE 절이 지정된 경우 else_result_expression을 반환하고 ELSE 절이 지정되지 않은 경우 NULL 값을 반환합니다.
예
1. SELECT 문에 단순 CASE 식 사용
SELECT
문 내에서 단순 CASE
식은 동등성만 검사하고 다른 비교 작업은 수행할 수 없습니다. 다음 예에서는 CASE
식을 사용하여 제품 라인 범주 표시를 이해하기 쉽게 변경합니다.
USE AdventureWorks;
GO
SELECT ProductNumber, Category =
CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
Name
FROM Production.Product
ORDER BY ProductNumber;
GO
2. SELECT 문에 검색된 CASE 식 사용
SELECT
문 내에서 검색된 CASE
식은 비교 값에 따라 결과 집합의 값이 바뀌도록 합니다. 다음 예에서는 제품의 가격 범위에 따라 가격을 텍스트 설명으로 표시합니다.
USE AdventureWorks;
GO
SELECT ProductNumber, Name, 'Price Range' =
CASE
WHEN ListPrice = 0 THEN 'Mfg item - not for resale'
WHEN ListPrice < 50 THEN 'Under $50'
WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
ELSE 'Over $1000'
END
FROM Production.Product
ORDER BY ProductNumber ;
GO
3. CASE를 사용하여 Microsoft Access에서 사용된 IIf 함수 대체
CASE는 Microsoft Access의 IIf 함수와 유사한 기능을 제공합니다. 다음 예에서는 IIf
를 사용하여 db1.ContactInfo
라는 Access 테이블의 TelephoneInstructions
열에 출력 값을 제공하는 간단한 쿼리를 보여 줍니다.
SELECT FirstName, LastName, TelephoneNumber,
IIf(IsNull(TelephoneInstructions),"Any time",
TelephoneInstructions) AS [When to Contact]
FROM db1.ContactInfo;
다음 예에서는 CASE
를 사용하여 AdventureWorks 뷰인 Person.vAdditionalContactInfo
의 TelephoneSpecialInstructions
열에 출력 값을 제공합니다.
USE AdventureWorks;
GO
SELECT FirstName, LastName, TelephoneNumber, 'When to Contact' =
CASE
WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time'
ELSE TelephoneSpecialInstructions
END
FROM Person.vAdditionalContactInfo;
4. ORDER BY 절에 CASE 사용
다음 예에서는 ORDER BY 절에 CASE 식을 사용하여 HumanResources.Employee
테이블의 SalariedFlag
열에 있는 값을 기준으로 행의 정렬 순서를 결정합니다. SalariedFlag
가 1로 설정된 직원은 EmployeeID
를 기준으로 내림차순으로 반환되고 SalariedFlag
가 0으로 설정된 직원은 EmployeeID
를 기준으로 오름차순으로 반환됩니다.
SELECT EmployeeID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN EmployeeID END DESC
,CASE WHEN SalariedFlag = 0 THEN EmployeeID END;
GO
5. UPDATE 문에 CASE 사용
다음 예에서는 UPDATE 문에 CASE 식을 사용하여 SalariedFlag
가 0으로 설정된 직원의 VacationHours
열에 설정된 값을 결정합니다. VacationHours
에서 10시간을 뺀 값이 음수이면 VacationHours
에 40시간이 더해지고, 그렇지 않으면 VacationHours
에 20시간이 더해집니다. OUTPUT 절은 휴가 전 값과 휴가 후 값을 표시하는 데 사용됩니다.
USE AdventureWorks;
GO
UPDATE HumanResources.Employee
SET VacationHours =
( CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
OUTPUT Deleted.EmployeeID, Deleted.VacationHours AS BeforeValue,
Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0;
6. SET 문에 CASE 사용
다음 예에서는 테이블 값 함수 dbo.GetContactInfo
의 SET 문에서 CASE 식을 사용합니다. AdventureWorks
데이터베이스에서 사람과 관련된 모든 데이터는 Person.Contact
테이블에 저장됩니다. 이러한 데이터의 예로는 직원, 공급업체 담당자, 대리점 담당자 또는 소비자가 있습니다. 이 함수는 지정된 ContactID
의 이름 및 성과 해당 사람의 연락처 유형을 반환합니다. SET 문의 CASE 식은 Employee
, StoreContact
, VendorContact
또는 Individual
(소비자) 테이블에 ContactID
가 존재하는지 여부에 따라 ContactType
열에 표시할 값을 결정합니다.
USE AdventureWorks;
GO
CREATE FUNCTION dbo.GetContactInformation(@ContactID int)
RETURNS @retContactInformation TABLE
(
ContactID int NOT NULL,
FirstName nvarchar(50) NULL,
LastName nvarchar(50) NULL,
ContactType nvarchar(50) NULL,
PRIMARY KEY CLUSTERED (ContactID ASC)
)
AS
-- Returns the first name, last name and contact type for the specified contact.
BEGIN
DECLARE
@FirstName nvarchar(50),
@LastName nvarchar(50),
@ContactType nvarchar(50);
-- Get common contact information
SELECT
@ContactID = ContactID,
@FirstName = FirstName,
@LastName = LastName
FROM Person.Contact
WHERE ContactID = @ContactID;
SET @ContactType =
CASE
-- Check for employee
WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e
WHERE e.ContactID = @ContactID)
THEN 'Employee'
-- Check for vendor
WHEN EXISTS(SELECT * FROM Purchasing.VendorContact AS vc
INNER JOIN Person.ContactType AS ct
ON vc.ContactTypeID = ct.ContactTypeID
WHERE vc.ContactID = @ContactID)
THEN 'Vendor Contact'
-- Check for store
WHEN EXISTS(SELECT * FROM Sales.StoreContact AS sc
INNER JOIN Person.ContactType AS ct
ON sc.ContactTypeID = ct.ContactTypeID
WHERE sc.ContactID = @ContactID)
THEN 'Store Contact'
-- Check for individual consumer
WHEN EXISTS(SELECT * FROM Sales.Individual AS i
WHERE i.ContactID = @ContactID)
THEN 'Consumer'
END;
-- Return the information to the caller
IF @ContactID IS NOT NULL
BEGIN
INSERT @retContactInformation
SELECT @ContactID, @FirstName, @LastName, @ContactType;
END;
RETURN;
END;
GO
SELECT ContactID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(2200);
GO
SELECT ContactID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(5);
7. HAVING 절에 CASE 사용
다음 예에서는 HAVING 절에 CASE 식을 사용하여 SELECT 문에서 반환되는 행을 제한합니다. 이 문은 HumanResources.Employee
테이블에 있는 각 직책에 대한 최대 시간당 급여를 반환합니다. HAVING 절은 직책을 최대 급여가 40달러보다 큰 남성의 직책과 최대 급여가 42달러보다 큰 여성의 직책으로 제한합니다.
USE AdventureWorks;
GO
SELECT Title, MAX(ph1.Rate)AS MaximumRate
FROM HumanResources.Employee AS e
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.EmployeeID = ph1.EmployeeID
GROUP BY Title
HAVING (MAX(CASE WHEN Gender = 'M'
THEN ph1.Rate
ELSE NULL END) > 40.00
OR MAX(CASE WHEN Gender = 'F'
THEN ph1.Rate
ELSE NULL END) > 42.00)
ORDER BY MaximumRate DESC;
참고 항목
참조
식(Transact-SQL)
SELECT(Transact-SQL)
COALESCE(Transact-SQL)
관련 자료
도움말 및 정보
변경 내역
릴리스 | 내역 |
---|---|
2006년 4월 14일 |
|