CASE(Transact-SQL)

업데이트: 2006년 4월 14일

조건 목록을 평가하고 가능한 여러 결과 식 중 하나를 반환합니다.

CASE 식에는 두 가지 형식이 있습니다.

  • 단순 CASE 식은 특정 식을 일련의 단순 식과 비교하여 결과를 결정합니다.
  • 검색된 CASE 식은 일련의 부울 식을 평가하여 결과를 결정합니다.

두 가지 형식 모두 선택 사항인 ELSE 인수를 지원합니다.

CASE는 유효한 식이 허용되는 모든 문 또는 절에서 사용할 수 있습니다. 예를 들어 SELECT, UPDATE, DELETE, SET 등의 문과 select_list, IN, WHERE, ORDER BY, HAVING 등의 절에서 CASE를 사용할 수 있습니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

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_expressionwhen_expression과 같거나 Boolean_expression이 TRUE인 경우에 반환되는 식입니다. result expression은 유효한 입니다.
  • ELSE else_result_expression
    TRUE로 평가된 비교 연산이 없을 때 반환되는 식입니다. 이 인수가 생략되고 TRUE로 평가된 비교 연산이 없는 경우 CASE는 NULL을 반환합니다. else_result_expression은 유효한 식입니다. else_result_expressionresult_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_expressionresult_expression을 반환합니다.
  • TRUE로 평가된 input_expression = when_expression이 없으면 SQL Server 데이터베이스 엔진에서 ELSE 절이 지정된 경우 else_result_expression을 반환하고 ELSE 절이 지정되지 않은 경우 NULL 값을 반환합니다.

검색된 CASE 식:

  • 지정된 순서대로 각 WHEN 절에 대해 Boolean_expression을 평가합니다.
  • 먼저 TRUE로 평가된 Boolean_expressionresult_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.vAdditionalContactInfoTelephoneSpecialInstructions 열에 출력 값을 제공합니다.

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)

관련 자료

CASE 사용

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2006년 4월 14일

새로운 내용
  • CASE를 사용하여 IIf 기능을 보여 주는 예를 추가했습니다.