다음을 통해 공유


CASE(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics분석 플랫폼 시스템(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

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

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

  • 단순CASE 식은 식을 단순 식 집합과 비교하여 결과를 결정합니다.

  • 검색된CASE 식은 부울 식 집합을 평가하여 결과를 확인합니다.

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

CASE는 유효한 식이 허용되는 모든 문 및 절에 사용할 수 있습니다. 예를 들어 , 및 , CASE 등의 문SELECTUPDATE, 및 DELETE와 같은 SET<select_list>INWHERE절에서 사용할 ORDER BY 수 있습니다. HAVING

Transact-SQL 구문 표기 규칙

Syntax

SQL Server, Azure SQL Database 및 Azure Synapse Analytics에 대한 구문입니다.

-- 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

병렬 데이터 웨어하우스용 구문

CASE
     WHEN when_expression THEN result_expression [ ...n ]
     [ ELSE else_result_expression ]
END

Arguments

input_expression

단순 CASE 형식을 사용할 때 평가되는 식입니다. input_expression은 유효한 입니다.

언제 when_expression

단순 형식을 사용할 때 CASE과 비교되는 단순 식입니다. when_expression은 유효한 식입니다. input_expression 및 각 when_expression의 데이터 형식은 동일하거나 암시적으로 변환되어야 합니다.

그런 다음 result_expression

input_expression when_expression 계산되거나TRUE 계산되는 TRUE경우 반환되는 식입니다. result_expression은 유효한 입니다.

그렇지 않으면 else_result_expression

비교 연산이 없으면 반환되는 식입니다.TRUE 이 인수를 생략하고 비교 연산이 계산되지 않으면 반환됩니다 TRUECASENULL. else_result_expression은 유효한 식입니다. else_result_expression 및 임의의 result_expression의 데이터 형식은 동일하거나 암시적으로 변환되어야 합니다.

언제 Boolean_expression

검색된 CASE 형식을 사용할 때 평가되는 부울 식입니다. Boolean_expression는 유효한 부울 식입니다.

반환 형식

result_expressions 및 선택적 else_result_expression의 형식 집합에서 우선 순위가 가장 높은 형식을 반환합니다. 자세한 내용은 데이터 형식 우선 순위를 참조 하세요.

반환 값

단순 CASE 식

단순 CASE 식은 동일성을 위해 각 WHEN 절의 식과 첫 번째 식을 비교하여 작동합니다. 이러한 식이 동일한 경우 절의 THEN 식이 반환됩니다.

  • 동등성만 검사합니다.

  • 지정된 순서에서 각 WHEN 절에 대해 input_expression = when_expression 평가합니다.

  • 계산 되는 첫 번째 input_expression when_expression = result_expression 반환합니다 TRUE.

  • input_expression when_expression = 계산TRUE되지 않으면 SQL Server 데이터베이스 엔진은 절이 지정된 경우 ELSE 반환하고NULL, 절이 지정되지 않은 ELSE 경우 값을 반환합니다.

검색된 CASE 식

  • 각 절에 대해 지정된 순서로 WHEN 평가합니다.

  • 계산되는 첫 번째 Boolean_expression result_expression반환합니다TRUE.

  • Boolean_expression 계산TRUE되지 않으면 데이터베이스 엔진은 절이 지정된 경우 ELSE 반환하고NULL, 절이 지정되지 않은 ELSE 경우 값을 반환합니다.

Remarks

SQL Server에서는 CASE 식의 중첩을 10개 수준까지만 허용합니다.

Transact-SQL 문, 문 블록, 사용자 정의 함수 및 저장 프로시저의 실행 흐름을 제어하는 데 CASE 식을 사용할 수는 없습니다. 흐름 제어 메서드 목록은 흐름 제어를 참조하세요.

CASE 식은 해당 조건을 순서대로 평가하고 충족되는 첫 번째 조건에서 중지합니다. CASE 식이 식의 결과를 입력으로 받기 전에 식이 계산되는 경우도 있습니다. 이러한 식을 계산하는 동안 오류가 발생할 수 있습니다. 식에 대한 인수 WHENCASE 나타나는 집계 식이 먼저 계산된 다음 식에 CASE 제공됩니다. 예를 들어 다음 쿼리는 집계 값을 MAX 생성할 때 0으로 나누기를 생성합니다. 이 단계는 식을 평가하기 전에 발생합니다 CASE .

WITH Data (value)
AS (
    SELECT 0
    UNION ALL
    SELECT 1
    )
SELECT CASE
        WHEN MIN(value) <= 0 THEN 0
        WHEN MAX(1 / value) >= 100 THEN 1
        END
FROM Data;
GO

집계 식이 아닌 스칼라 식의 조건 평가 WHEN 순서(스칼라를 반환하는 비관계형 하위 쿼리 포함)에만 의존해야 합니다.

또는 THEN 절의 식 중 ELSE 하나 이상이 상수가 아닌지 NULL 확인해야 합니다. 여러 결과 식에서 반환할 수 있지만 NULL 모든 식이 명시적으로 상수가 될 NULL 수는 없습니다. 모든 결과 식에서 NULL 상수가 사용되면 오류 8133이 반환됩니다.

Examples

이 문서의 코드 샘플은 AdventureWorks2025 또는 AdventureWorksDW2025 샘플 데이터베이스를 사용합니다. 이 데이터베이스는 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.

A. SELECT 문에 단순 CASE 식 사용

SELECT 문 내에서 단순 CASE 식은 동등성만 검사하고 다른 비교 작업은 수행할 수 없습니다. 다음 예에서는 CASE 식을 사용하여 제품 라인 범주 표시를 이해하기 쉽게 변경합니다.

USE AdventureWorks2022;
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

B. SELECT 문에 검색된 CASE 식 사용

SELECT 문 내에서 검색된 CASE 식은 비교 값에 따라 결과 집합의 값이 바뀌도록 합니다. 다음 예에서는 제품의 가격 범위에 따라 가격을 텍스트 설명으로 표시합니다.

USE AdventureWorks2022;
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

C. ORDER BY 절에 CASE 사용

다음 예제에서는 절의 CASEORDER BY 식을 사용하여 지정된 열 값에 따라 행의 정렬 순서를 결정합니다. 첫 번째 예에서는 SalariedFlag 테이블의 HumanResources.Employee 열의 값이 계산됩니다. SalariedFlag가 1로 설정된 직원은 BusinessEntityID 순서에 따라 내림차순으로 반환됩니다. SalariedFlag가 0으로 설정된 직원은 BusinessEntityID 순서에 따라 오름차순으로 반환됩니다.

SELECT BusinessEntityID,
    SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
        WHEN 1 THEN BusinessEntityID
        END DESC,
    CASE
        WHEN SalariedFlag = 0 THEN BusinessEntityID
        END;
GO

두 번째 예에서 결과 집합은 TerritoryName 열이 'United States'와 동일하면 CountryRegionName 열을 기준으로 정렬되고 그 외 다른 행에는 CountryRegionName 열을 기준으로 정렬됩니다.

SELECT BusinessEntityID,
    LastName,
    TerritoryName,
    CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName
        WHEN 'United States' THEN TerritoryName
        ELSE CountryRegionName
        END;
GO

D. UPDATE 문에 CASE 사용

다음 예제에서는 문의 식을 CASE 사용하여 UPDATE 0으로 VacationHours 설정된 직원의 열 SalariedFlag 에 대해 설정된 값을 결정합니다. VacationHours에서 10시간을 뺀 결과 음수 값이 되면 VacationHours가 40시간 증가되고, 그렇지 않으면 VacationHours가 20시간 증가됩니다. 절 OUTPUT 은 휴가 전후 값을 표시하는 데 사용됩니다.

USE AdventureWorks2022;
GO

UPDATE HumanResources.Employee
SET VacationHours = (
        CASE
            WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
            ELSE (VacationHours + 20.00)
            END
        )
OUTPUT Deleted.BusinessEntityID,
    Deleted.VacationHours AS BeforeValue,
    Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0;
GO

E. SET 문에 CASE 사용

다음 예제에서는 테이블 반환 함수CASESET 문에서 식을 사용합니다dbo.GetContactInfo. AdventureWorks2025 데이터베이스에서 사용자와 관련된 모든 데이터는 Person.Person 테이블에 저장됩니다. 예를 들어 직원, 공급업체 담당자 또는 고객일 수 있습니다. 함수는 지정된 FirstName 사람의 이름(LastName) 및 패밀리 이름(BusinessEntityID)과 해당 사용자의 연락처 유형을 반환합니다. 문의 식은 CASE 열 또는 테이블에 열이 있는지 SET 여부에 따라 열 ContactTypeBusinessEntityIDEmployeeVendor 대해 표시할 값을 결정합니다.Customer

USE AdventureWorks2022;
GO

CREATE FUNCTION dbo.GetContactInformation (
    @BusinessEntityID INT
)
RETURNS
    @retContactInformation TABLE (
        BusinessEntityID INT NOT NULL,
        FirstName NVARCHAR (50) NULL,
        LastName NVARCHAR (50) NULL,
        ContactType NVARCHAR (50) NULL,
        PRIMARY KEY CLUSTERED (BusinessEntityID 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 @BusinessEntityID = BusinessEntityID,
        @FirstName = FirstName,
        @LastName = LastName
    FROM Person.Person
    WHERE BusinessEntityID = @BusinessEntityID;

    SET @ContactType = CASE
            -- Check for employee
            WHEN EXISTS (
                    SELECT *
                    FROM HumanResources.Employee AS e
                    WHERE e.BusinessEntityID = @BusinessEntityID
                    )
                THEN 'Employee'
            -- Check for vendor
            WHEN EXISTS (
                    SELECT *
                    FROM Person.BusinessEntityContact AS bec
                    WHERE bec.BusinessEntityID = @BusinessEntityID
                    )
                THEN 'Vendor'
            -- Check for store
            WHEN EXISTS (
                    SELECT *
                    FROM Purchasing.Vendor AS v
                    WHERE v.BusinessEntityID = @BusinessEntityID
                    )
                THEN 'Store Contact'
            -- Check for individual consumer
            WHEN EXISTS (
                    SELECT *
                    FROM Sales.Customer AS c
                    WHERE c.PersonID = @BusinessEntityID
                    )
                THEN 'Consumer'
            END;

    -- Return the information to the caller
    IF @BusinessEntityID IS NOT NULL
        BEGIN
            INSERT @retContactInformation
            SELECT @BusinessEntityID,
                   @FirstName,
                   @LastName,
                   @ContactType;
        END
    RETURN;
END
GO

SELECT BusinessEntityID,
    FirstName,
    LastName,
    ContactType
FROM dbo.GetContactInformation(2200);
GO

SELECT BusinessEntityID,
    FirstName,
    LastName,
    ContactType
FROM dbo.GetContactInformation(5);
GO

F. HAVING 절에 CASE 사용

다음 예제에서는 절의 CASE 식을 사용하여 문에서 HAVING 반환된 행을 SELECT 제한합니다. 이 명령문은 HumanResources.Employee 테이블에서 각 직함에 대한 최대 시간당 급여를 반환합니다. 이 조항은 HAVING 최대 급여가 40달러를 초과하는 급여를 받는 직원 또는 최대 급여가 15달러보다 큰 비정형 직원으로 타이틀을 제한합니다.

USE AdventureWorks2022;
GO

SELECT JobTitle,
    MAX(ph1.Rate) AS MaximumRate
FROM HumanResources.Employee AS e
INNER JOIN HumanResources.EmployeePayHistory AS ph1
    ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (
    MAX(CASE
            WHEN SalariedFlag = 1 THEN ph1.Rate
            ELSE NULL
        END) > 40.00
    OR MAX(CASE
            WHEN SalariedFlag = 0 THEN ph1.Rate
            ELSE NULL
        END) > 15.00
)
ORDER BY MaximumRate DESC;
GO

G. 중첩된 CASE 식을 사용하여 결과 분류

다음 예제에서는 중첩된 CASE 식을 사용하여 제품을 기준으로 ListPrice분류합니다. 제품 정가가 1,000달러를 초과하는 경우 고려됩니다 High-end. 나머지 제품은 중첩 CASE 식에 따라 ProductLine 분류됩니다 ListPrice.

USE AdventureWorks2022;
GO

SELECT 
    ProductNumber,
    Name,
    ListPrice,
    PriceCategory = 
        CASE 
            WHEN ListPrice > 1000 THEN 'High-end'
            ELSE 
                CASE ProductLine
                    WHEN 'R' THEN
                        CASE 
                            WHEN ListPrice > 500 THEN 'Premium Road'
                            ELSE 'Standard Road'
                        END
                    WHEN 'M' THEN
                        CASE 
                            WHEN ListPrice > 500 THEN 'Premium Mountain'
                            ELSE 'Standard Mountain'
                        END
                    WHEN 'T' THEN 'Touring'
                    ELSE 'Other'
                END
        END
FROM Production.Product
ORDER BY ListPrice DESC;

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

H. CASE 식이 포함된 SELECT 문 사용

SELECT 문 내에서 식에서는 CASE 비교 값을 기반으로 결과 집합에서 값을 바꿀 수 있습니다. 다음 예에서는 CASE 식을 사용하여 제품 라인 범주 표시를 이해하기 쉽게 변경합니다. 값이 없으면 텍스트 Not for sale 가 표시됩니다.

SELECT ProductAlternateKey,
    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,
    EnglishProductName
FROM dbo.DimProduct
ORDER BY ProductKey;
GO

I. UPDATE 문에 CASE 사용

다음 예제에서는 문의 식을 CASE 사용하여 UPDATE 0으로 VacationHours 설정된 직원의 열 SalariedFlag 에 대해 설정된 값을 결정합니다. VacationHours에서 10시간을 뺀 결과 음수 값이 되면 VacationHours가 40시간 증가되고, 그렇지 않으면 VacationHours가 20시간 증가됩니다.

UPDATE dbo.DimEmployee
SET VacationHours = (
        CASE
            WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
            ELSE (VacationHours + 20.00)
            END
        )
WHERE SalariedFlag = 0;
GO