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

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Evalúa una lista de condiciones y devuelve una de las varias expresiones de resultado posibles.Evaluates a list of conditions and returns one of multiple possible result expressions.

La expresión CASE tiene dos formatos:The CASE expression has two formats:

  • La expresión CASE sencilla compara una expresión con un conjunto de expresiones sencillas para determinar el resultado.The simple CASE expression compares an expression to a set of simple expressions to determine the result.

  • La expresión CASE buscada evalúa un conjunto de expresiones booleanas para determinar el resultado.The searched CASE expression evaluates a set of Boolean expressions to determine the result.

    Ambos formatos admiten un argumento ELSE opcional.Both formats support an optional ELSE argument.

    CASE se puede utilizar en cualquier instrucción o cláusula que permite una expresión válida.CASE can be used in any statement or clause that allows a valid expression. Por ejemplo, puede utilizar CASE en instrucciones como SELECT, UPDATE, DELETE y SET, y en cláusulas como select_list, IN, WHERE, ORDER BY y 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.

    Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

input_expressioninput_expression
Es la expresión evaluada cuando se utiliza el formato CASE sencillo.Is the expression evaluated when the simple CASE format is used. input_expression se trata de cualquier expresión.input_expression is any valid expression.

Cuando when_expressionWHEN when_expression
Es una expresión simple que input_expression se compara cuando se utiliza el formato CASE sencillo.Is a simple expression to which input_expression is compared when the simple CASE format is used. when_expression es cualquier expresión válida.when_expression is any valid expression. Los tipos de datos de input_expression y cada when_expression deben ser iguales o deben ser una conversión implícita.The data types of input_expression and each when_expression must be the same or must be an implicit conversion.

A continuación, result_expressionTHEN result_expression
Es la expresión devuelta cuando input_expression es igual a when_expression se evalúa como TRUE, o Boolean_expression se evalúa como TRUE.Is the expression returned when input_expression equals when_expression evaluates to TRUE, or Boolean_expression evaluates to TRUE. expresión de resultado se trata de cualquier expresión.result expression is any valid expression.

ELSE else_result_expressionELSE else_result_expression
Es la expresión que se devuelve si ninguna comparación se evalúa como TRUE.Is the expression returned if no comparison operation evaluates to TRUE. Si se omite este argumento y ninguna comparación se evalúa como TRUE, CASE devuelve NULL.If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL. else_result_expression es cualquier expresión válida.else_result_expression is any valid expression. Los tipos de datos de else_result_expression y cualquier result_expression deben ser iguales o deben ser una conversión implícita.The data types of else_result_expression and any result_expression must be the same or must be an implicit conversion.

Cuando Boolean_expressionWHEN Boolean_expression
Es la expresión booleana que se evalúa cuando se utiliza el formato CASE de búsqueda.Is the Boolean expression evaluated when using the searched CASE format. Boolean_expression es cualquier expresión booleana válida.Boolean_expression is any valid Boolean expression.

Tipos devueltosReturn Types

Devuelve el tipo de prioridad más alto del conjunto de tipos de result_expressions y opcional else_result_expression.Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression. Para obtener más información, vea Prioridad de tipo de datos (Transact-SQL).For more information, see Data Type Precedence (Transact-SQL).

Valores devueltosReturn Values

Expresión CASE simple:Simple CASE expression:

La expresión CASE simple compara la primera expresión con la expresión de cada cláusula WHEN para determinar si se da alguna equivalencia.The simple CASE expression operates by comparing the first expression to the expression in each WHEN clause for equivalency. Si estas expresiones son equivalentes, se devolverá la expresión de la cláusula THEN.If these expressions are equivalent, the expression in the THEN clause will be returned.

  • Permite solo una comprobación de igualdad.Allows only an equality check.

  • En el orden especificado, evalúa input_expression = when_expression por cada cláusula WHEN.In the order specified, evaluates input_expression = when_expression for each WHEN clause.

  • Devuelve el result_expression del primer input_expression = when_expression que se evalúa como TRUE.Returns the result_expression of the first input_expression = when_expression that evaluates to TRUE.

  • Si no hay ningún input_expression = when_expression se evalúa como TRUE, el Motor de base de datos de SQL ServerSQL Server Database Engine devuelve el else_result_expression si es una cláusula ELSE Especifica, o un valor NULL si no se especifica ninguna cláusula ELSE.If no input_expression = when_expression evaluates to TRUE, the Motor de base de datos de SQL ServerSQL Server Database Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

    Expresión CASE de búsqueda:Searched CASE expression:

  • Da como resultado, en el orden especificado, Boolean_expression para cada cláusula WHEN.Evaluates, in the order specified, Boolean_expression for each WHEN clause.

  • Devuelve result_expression del primer Boolean_expression que se evalúa como TRUE.Returns result_expression of the first Boolean_expression that evaluates to TRUE.

  • Si no hay ningún Boolean_expression se evalúa como TRUE, el Motor de base de datosDatabase Engine devuelve el else_result_expression si se especifica una cláusula ELSE, o un valor NULL si no se especifica ninguna cláusula ELSE.If no Boolean_expression evaluates to TRUE, the Motor de base de datosDatabase Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

ComentariosRemarks

SQL ServerSQL Server solo permite 10 niveles de anidamiento en las expresiones CASE. allows for only 10 levels of nesting in CASE expressions.

La expresión CASE no se puede utilizar para controlar el flujo de ejecución de los bloques de instrucciones, funciones definidas por el usuario, procedimientos almacenados e instrucciones de 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. Para obtener una lista de métodos de control de flujo, vea lenguaje de Control de flujo ( Transact-SQL ) .For a list of control-of-flow methods, see Control-of-Flow Language (Transact-SQL).

La instrucción CASE devuelve las condiciones de forma secuencial y se detiene en la primera condición cuya condición se cumple.The CASE statement evaluates its conditions sequentially and stops with the first condition whose condition is satisfied. En algunas situaciones, se evalúa una expresión antes de que una instrucción CASE reciba los resultados de la expresión como entrada.In some situations, an expression is evaluated before a CASE statement receives the results of the expression as its input. Los errores de evaluación de estas expresiones son posibles.Errors in evaluating these expressions are possible. Las expresiones de agregado que aparecen en los argumentos WHEN para una instrucción CASE se evalúan primero y, a continuación, se proporcionan a la instrucción CASE.Aggregate expressions that appear in WHEN arguments to a CASE statement are evaluated first, then provided to the CASE statement. Por ejemplo, la siguiente consulta genera un error de división por cero al obtener el valor de agregado MAX.For example, the following query produces a divide by zero error when producing the value of the MAX aggregate. Esto ocurre antes de evaluar la expresión 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 ;  

Debe depender solo del orden de evaluación de las condiciones WHEN para las expresiones escalares (incluidas las subconsultas no correlacionadas que devuelven escalares), no para las expresiones de agregado.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.

EjemplosExamples

A.A. Usar una instrucción SELECT con una expresión CASE sencillaUsing a SELECT statement with a simple CASE expression

En una instrucción SELECT, una expresión CASE sencilla solo permite una comprobación de igualdad; no se pueden hacer otras comparaciones.Within a SELECT statement, a simple CASE expression allows for only an equality check; no other comparisons are made. En este ejemplo se utiliza la expresión CASE para cambiar la presentación de categorías de línea de productos con el fin de hacerla más comprensible.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. Usar una instrucción SELECT con una expresión CASE de búsquedaUsing a SELECT statement with a searched CASE expression

En una instrucción SELECT, la expresión CASE de búsqueda permite sustituir valores en el conjunto de resultados basándose en los valores de comparación.Within a SELECT statement, the searched CASE expression allows for values to be replaced in the result set based on comparison values. En el ejemplo siguiente se presenta el precio de venta como un comentario basado en el intervalo de precios de un producto.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. Usar CASE en una cláusula ORDER BYUsing CASE in an ORDER BY clause

En los ejemplos siguientes se utiliza la expresión CASE en una cláusula ORDER BY para determinar el criterio de ordenación de las filas según el valor de una columna dada.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. En el primer ejemplo se evalúe el valor de la columna SalariedFlag de la tabla HumanResources.Employee.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Los empleados que tienen la columna SalariedFlag establecida en 1 se devuelven en orden descendente según el BusinessEntityID.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Los empleados que tienen la columna SalariedFlag establecida en 0 se devuelven en orden ascendente según el BusinessEntityID.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. En el segundo ejemplo, el conjunto de resultados se ordena según la columna TerritoryName cuando la columna CountryRegionName es igual a 'United States' y según la columna CountryRegionName en las demás filas.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. Usar CASE en una instrucción UPDATEUsing CASE in an UPDATE statement

En el ejemplo siguiente se usa la expresión CASE en una instrucción UPDATE para determinar el valor establecido en la columna VacationHours para los empleados con el valor de SalariedFlag establecido en 0.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. Al restar 10 horas de VacationHours da un valor negativo, VacationHours se incrementa en 40 horas; de lo contrario, VacationHours se incrementa en 20 horas.When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours. La cláusula OUTPUT se utiliza para mostrar los valores de las vacaciones antes y después.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. Usar CASE en una instrucción SETUsing CASE in a SET statement

En el ejemplo siguiente se usa la expresión CASE en una instrucción SET en la función con valores de tabla dbo.GetContactInfo.The following example uses the CASE expression in a SET statement in the table-valued function dbo.GetContactInfo. En la base de datos AdventureWorks2012AdventureWorks2012, todos los datos relacionados con las personas están almacenados en la tabla Person.Person.In the AdventureWorks2012AdventureWorks2012 database, all data related to people is stored in the Person.Person table. Por ejemplo, la persona puede ser un empleado, el representante del proveedor o un cliente.For example, the person may be an employee, vendor representative, or a customer. La función devuelve el nombre y apellido de un determinado BusinessEntityID y el tipo de contacto para esa persona. La expresión CASE en la instrucción SET determina el valor para mostrar para la columna ContactType en función de la existencia de la BusinessEntityID columna en el Employee, Vendor, o Customer tablas.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. Usar CASE en una cláusula HAVINGUsing CASE in a HAVING clause

En el ejemplo siguiente se utiliza la expresión CASE en una cláusula HAVING para restringir las filas devueltas por la instrucción SELECT.The following example uses the CASE expression in a HAVING clause to restrict the rows returned by the SELECT statement. La instrucción devuelve el precio por hora máximo para cada puesto de trabajo en el HumanResources.Employee tabla.The statement returns the maximum hourly rate for each job title in the HumanResources.Employee table. La cláusula HAVING restringe los títulos a aquellos que tienen los hombres con una tasa de pago máxima mayor que 40 dólares o las mujeres con una tasa de pago máxima mayor que 42 dólares.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;  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

G.G. Usar una instrucción SELECT con una expresión CASEUsing a SELECT statement with a CASE expression

Dentro de una instrucción SELECT, la expresión CASE permite valores que se pueden sustituir en el conjunto de resultados en función de los valores de comparación.Within a SELECT statement, the CASE expression allows for values to be replaced in the result set based on comparison values. En el ejemplo siguiente se usa la expresión CASE para cambiar la presentación de categorías de línea de productos para que resulten más comprensibles.The following example uses the CASE expression to change the display of product line categories to make them more understandable. Cuando no existe ningún valor, el texto "no para la venta ' se muestra.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. Usar CASE en una instrucción UPDATEUsing CASE in an UPDATE statement

En el ejemplo siguiente se usa la expresión CASE en una instrucción UPDATE para determinar el valor establecido en la columna VacationHours para los empleados con el valor de SalariedFlag establecido en 0.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. Al restar 10 horas de VacationHours da un valor negativo, VacationHours se incrementa en 40 horas; de lo contrario, VacationHours se incrementa en 20 horas.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;  

Vea tambiénSee Also

Expresiones ( Transact-SQL ) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
COALESCE ( Transact-SQL ) COALESCE (Transact-SQL)
IIF ( Transact-SQL ) IIF (Transact-SQL)
Elija ( Transact-SQL )CHOOSE (Transact-SQL)