CASE (Transact-SQL)CASE (Transact-SQL)

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

一連の条件を評価して、考えられる結果式のうちの 1 つを返します。Evaluates a list of conditions and returns one of multiple possible result expressions.

CASE 式には 2 つの形式があります。The CASE expression has two formats:

  • 単純 CASE 式では、1 つの式を一連の単純式と比較して結果を決定します。The simple CASE expression compares an expression to a set of simple expressions to determine the result.

  • 検索 CASE 式では、一連のブール式を評価して結果を判定します。The searched CASE expression evaluates a set of Boolean expressions to determine the result.

    どちらの形式も、ELSE 引数 (省略可) をサポートしています。Both formats support an optional ELSE argument.

    CASE は、有効な式を使用できる任意のステートメントや句で使用できます。CASE can be used in any statement or clause that allows a valid expression. たとえば、SELECT、UPDATE、DELETE、SET などのステートメントや、select_list、IN、WHERE、ORDER BY、HAVING などの句で使用できます。For example, you can use CASE in statements such as SELECT, UPDATE, DELETE and SET, and in clauses such as select_list, IN, WHERE, ORDER BY, and HAVING.

    トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  

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  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

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

引数Arguments

input_expressioninput_expression
単純 CASE 形式を使用した場合に評価される式です。Is the expression evaluated when the simple CASE format is used. input_expression は任意の有効なです。input_expression is any valid expression.

WHEN when_expressionWHEN when_expression
単純 CASE 形式を使用した場合に input_expression と比較される単純式です。Is a simple expression to which input_expression is compared when the simple CASE format is used. when_expression は任意の有効な式です。when_expression is any valid expression. input_expression と各 when_expression のデータ型は同一であるか、暗黙的な変換によって同一の型になる必要があります。The data types of input_expression and each when_expression must be the same or must be an implicit conversion.

THEN result_expressionTHEN result_expression
input_expression = when_expression が TRUE に評価されるとき、または Boolean_expression が TRUE に評価されるときに返される式です。Is the expression returned when input_expression equals when_expression evaluates to TRUE, or Boolean_expression evaluates to TRUE. result_expression は任意の有効なです。result expression is any valid expression.

ELSE else_result_expressionELSE else_result_expression
比較操作の評価がいずれも TRUE でなかった場合に返される式です。Is the expression returned if no comparison operation evaluates to TRUE. この引数を省略し、比較操作のいずれも TRUE でなかった場合、CASE は NULL を返します。If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL. else_result_expression は任意の有効な式です。else_result_expression is any valid expression. else_result_expression とすべての result_expression のデータ型は同一であるか、暗黙的な変換によって同一の型になる必要があります。The data types of else_result_expression and any result_expression must be the same or must be an implicit conversion.

WHEN Boolean_expressionWHEN Boolean_expression
検索 CASE 形式で評価するブール式です。Is the Boolean expression evaluated when using the searched CASE format. Boolean_expression は任意の有効なブール式です。Boolean_expression is any valid Boolean expression.

戻り値の型Return Types

result_expressions および省略可能な else_result_expression の一連の型から、最も優先順位の高い型を返します。Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression. 詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。For more information, see Data Type Precedence (Transact-SQL).

戻り値Return Values

単純 CASE 式:Simple CASE expression:

単純 CASE 式では、最初の式が各 WHEN 句の式と比較されて、等しいかどうかが確認されます。The simple CASE expression operates by comparing the first expression to the expression in each WHEN clause for equivalency. 等しかった場合は、THEN 句の式が返されます。If these expressions are equivalent, the expression in the THEN clause will be returned.

  • 実行できるのは、等しいかどうかのチェックだけです。Allows only an equality check.

  • 各 WHEN 句の input_expression = when_expression を指定した順序で評価します。In the order specified, evaluates input_expression = when_expression for each WHEN clause.

  • TRUE に評価される最初の input_expression = when_expressionresult_expression を返します。Returns the result_expression of the first input_expression = when_expression that evaluates to TRUE.

  • input_expression = when_expression の評価がいずれも TRUE でなかった場合、 SQL Server データベース エンジンSQL Server Database Engine は、ELSE 句が指定されていれば else_result_expression を、ELSE 句が指定されていない場合は NULL を返します。If no input_expression = when_expression evaluates to TRUE, the SQL Server データベース エンジンSQL Server Database Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

    検索 CASE 式:Searched CASE expression:

  • 各 WHEN 句の Boolean_expression を指定した順序で評価します。Evaluates, in the order specified, Boolean_expression for each WHEN clause.

  • TRUE と評価された最初の Boolean_expressionresult_expression を返します。Returns result_expression of the first Boolean_expression that evaluates to TRUE.

  • Boolean_expression の評価がいずれも TRUE でなかった場合、 データベース エンジンDatabase Engine は、ELSE 句が指定されていれば else_result_expression を、ELSE 句が指定されていない場合は NULL を返します。If no Boolean_expression evaluates to TRUE, the データベース エンジンDatabase Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

RemarksRemarks

SQL ServerSQL Server では、Case 式に入れ子にできるのは 10 レベルまでです。allows for only 10 levels of nesting in CASE expressions.

CASE 式を使用して、Transact-SQL ステートメント、ステートメント ブロック、ユーザー定義関数、およびストアド プロシージャの実行フローを制御することはできません。The CASE expression cannot be used to control the flow of execution of Transact-SQL statements, statement blocks, user-defined functions, and stored procedures. フロー制御言語の一覧については、「フロー制御言語 (Transact-SQL)」を参照してください。For a list of control-of-flow methods, see Control-of-Flow Language (Transact-SQL).

CASE 式ではその条件が順に評価され、最初に条件が満たされた時点で評価が停止されます。The CASE expression evaluates its conditions sequentially and stops with the first condition whose condition is satisfied. CASE 式には、評価された式の結果が入力として渡されることがあります。In some situations, an expression is evaluated before a CASE expression receives the results of the expression as its input. こうした式の評価中にエラーが発生する可能性もあります。Errors in evaluating these expressions are possible. CASE 式の WHEN 引数に指定された集計式は、あらかじめ評価されて CASE 式に渡されます。Aggregate expressions that appear in WHEN arguments to a CASE expression are evaluated first, then provided to the CASE expression. たとえば、次のクエリでは、MAX 集計値を生成する際に 0 除算エラーが発生します。For example, the following query produces a divide by zero error when producing the value of the MAX aggregate. このエラーが発生するのは、CASE 式が評価される前です。This occurs prior to evaluating the CASE expression.

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 ;  

WHEN 条件が上から順に評価されるという前提は、スカラー式 (スカラー値を返す非相関サブクエリを含む) では問題ありませんが、集計式では成立しないので注意が必要です。You should only depend on order of evaluation of the WHEN conditions for scalar expressions (including non-correlated sub-queries that return scalars), not for aggregate expressions.

使用例Examples

A.A. SELECT ステートメントを単純 CASE 式と共に使用するUsing a SELECT statement with a simple CASE expression

SELECT ステートメント内では、単純 CASE 式は等しいかどうかのチェックだけを実行できます。これ以外の比較操作は実行できません。Within a SELECT statement, a simple CASE expression allows for only an equality check; no other comparisons are made. CASE 式を使用して、製品ラインのカテゴリの表示をわかりやすいものに変更する例を次に示します。The following example uses the CASE expression to change the display of product line categories to make them more understandable.

USE AdventureWorks2012;  
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.B. SELECT ステートメントを検索 CASE 式と共に使用するUsing a SELECT statement with a searched CASE expression

SELECT ステートメント内では、検索 CASE 式は比較値に基づいて結果セット内で値を置換できます。Within a SELECT statement, the searched CASE expression allows for values to be replaced in the result set based on comparison values. 次の例では、表示価格を、製品の価格範囲に基づいたテキスト コメントとして表示しています。The following example displays the list price as a text comment based on the price range for a product.

USE AdventureWorks2012;  
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.C. ORDER BY 句で CASE を使用するUsing CASE in an ORDER BY clause

次の例では、ORDER BY 句で CASE 式を使用して、指定された列の値に基づいて行の並べ替え順序を決定しています。The following examples uses the CASE expression in an ORDER BY clause to determine the sort order of the rows based on a given column value. 最初の例では、SalariedFlag テーブルの HumanResources.Employee 列の値を評価します。In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. SalariedFlag が 1 に設定されている従業員は BusinessEntityID の降順で、Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. SalariedFlag が 0 に設定されている従業員は BusinessEntityID の昇順で返されます。Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. 2 番目の例では、TerritoryName 列が 'United States' と等しい場合は結果セットが CountryRegionName 列の順序に従って並べ替えられ、他のすべての列は CountryRegionName の順序に従って並べ替えられます。In the second example, the result set is ordered by the column TerritoryName when the column CountryRegionName is equal to 'United States' and by CountryRegionName for all other rows.

SELECT BusinessEntityID, SalariedFlag  
FROM HumanResources.Employee  
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC  
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;  
GO  
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;  

D.D. UPDATE ステートメントで CASE を使用するUsing CASE in an UPDATE statement

次の例では、UPDATE ステートメントで CASE 式を使用して、VacationHours が 0 に設定されている従業員の SalariedFlag 列の値を決定しています。The following example uses the CASE expression in an UPDATE statement to determine the value that is set for the column VacationHours for employees with SalariedFlag set to 0. 10 時間差し引くと VacationHours 結果が負の値では、 VacationHours は 40 時間以外の VacationHours 20 時間が増加します。When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours. OUTPUT 句は、この処理の前後の休暇の値を表示するために使用されています。The OUTPUT clause is used to display the before and after vacation values.

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

E.E. SET ステートメントで CASE を使用するUsing CASE in a SET statement

次の例では、テーブル値関数 dbo.GetContactInfo の SET ステートメントで CASE 式を使用しています。The following example uses the CASE expression in a SET statement in the table-valued function dbo.GetContactInfo. AdventureWorks2012AdventureWorks2012 データベースでは、人に関連するデータはすべて Person.Person テーブルに格納されています。In the AdventureWorks2012AdventureWorks2012 database, all data related to people is stored in the Person.Person table. たとえば、従業員、仕入先の代表者、消費者などはすべて人に関連するデータとして扱われます。For example, the person may be an employee, vendor representative, or a customer. この関数は、指定された BusinessEntityID の氏名と連絡先タイプを返します。ContactType 列に表示される値は、SET ステートメント内の CASE 式により、EmployeeVendor、または Customer のどのテーブルに BusinessEntityID 列が含まれているかに基づいて決定されます。The function returns the first and last name of a given BusinessEntityID and the contact type for that person.The CASE expression in the SET statement determines the value to display for the column ContactType based on the existence of the BusinessEntityID column in the Employee, Vendor, or Customer tables.


USE AdventureWorks2012;  
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);  

F.F. HAVING 句で CASE を使用するUsing CASE in a HAVING clause

次の例では、HAVING 句で CASE 式を使用して、SELECT ステートメントで返される行を制限しています。The following example uses the CASE expression in a HAVING clause to restrict the rows returned by the SELECT statement. このステートメントは、HumanResources.Employee テーブル内の各役職の最も高い時給を返します。The statement returns the maximum hourly rate for each job title in the HumanResources.Employee table. HAVING 句では、最も高い時給が男性の場合には 40 ドル、女性の場合には 42 ドルを超えている役職のみが返されるように制限しています。The HAVING clause restricts the titles to those that are held by men with a maximum pay rate greater than 40 dollars or women with a maximum pay rate greater than 42 dollars.

USE AdventureWorks2012;  
GO  
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate  
FROM HumanResources.Employee AS e  
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID  
GROUP BY JobTitle  
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;  

例: Azure SQL データ ウェアハウスAzure SQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

G.G. SELECT ステートメントを単純 CASE 式と共に使用するUsing a SELECT statement with a CASE expression

SELECT ステートメント内では、CASE 式は比較値に基づいて結果セット内で値を置換できます。Within a SELECT statement, the CASE expression allows for values to be replaced in the result set based on comparison values. CASE 式を使用して、製品ラインのカテゴリの表示をわかりやすいものに変更する例を次に示します。The following example uses the CASE expression to change the display of product line categories to make them more understandable. 値が存在しない場合は、テキスト "Not for sale" が表示されます。When a value does not exist, the text "Not for sale' is displayed.

-- Uses AdventureWorks  

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;  

H.H. UPDATE ステートメントで CASE を使用するUsing CASE in an UPDATE statement

次の例では、UPDATE ステートメントで CASE 式を使用して、VacationHours が 0 に設定されている従業員の SalariedFlag 列の値を決定しています。The following example uses the CASE expression in an UPDATE statement to determine the value that is set for the column VacationHours for employees with SalariedFlag set to 0. VacationHours の値を 10 時間差し引くと値がマイナスになる場合は VacationHours の値を 40 時間増やします。それ以外の場合は、VacationHours の値を 20 時間増やします。When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours.

-- Uses AdventureWorks   

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

参照See Also

式 (Transact-SQL) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
COALESCE (Transact-SQL) COALESCE (Transact-SQL)
IIF (Transact-SQL) IIF (Transact-SQL)
CHOOSE (Transact-SQL)CHOOSE (Transact-SQL)