CASE (Transact-SQL)CASE (Transact-SQL)
Se aplica a:Applies to: SQL ServerSQL Server (todas las versiones admitidas)
SQL ServerSQL Server (all supported versions)
Azure SQL DatabaseAzure SQL Database
Azure SQL DatabaseAzure SQL Database
Instancia administrada de Azure SQLAzure SQL Managed Instance
Instancia administrada de Azure SQLAzure SQL Managed Instance
Azure Synapse AnalyticsAzure Synapse Analytics
Azure Synapse AnalyticsAzure Synapse Analytics
Almacenamiento de datos paralelosParallel Data Warehouse
Almacenamiento de datos paralelosParallel Data WarehouseSe aplica a:Applies to:
SQL ServerSQL Server (todas las versiones admitidas)
SQL ServerSQL Server (all supported versions)
Azure SQL DatabaseAzure SQL Database
Azure SQL DatabaseAzure SQL Database
Instancia administrada de Azure SQLAzure SQL Managed Instance
Instancia administrada de Azure SQLAzure SQL Managed Instance
Azure Synapse AnalyticsAzure Synapse Analytics
Azure Synapse AnalyticsAzure Synapse Analytics
Almacenamiento de datos paralelosParallel Data Warehouse
Almacenamiento de datos paralelosParallel 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.
Convenciones de sintaxis de Transact-SQL
Transact-SQL Syntax Conventions
SintaxisSyntax
-- Syntax for SQL Server, Azure SQL Database and 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
-- Syntax for Parallel Data Warehouse
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
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 es cualquier expresión válida.input_expression is any valid expression.
WHEN when_expressionWHEN when_expression
Es una expresión sencilla con la que se compara input_expression cuando se usa 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.
THEN result_expressionTHEN result_expression
Es la expresión devuelta cuando input_expression 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. result expression es cualquier expresión válida.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 cada 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.
WHEN 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.
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
Tipos de valor devueltoReturn Types
Devuelve el tipo de prioridad más alto del conjunto de tipos de result_expressions y la expresión else_result_expression opcional.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 sencilla: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 la result_expression de la primera relación 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 ninguna relación input_expression = when_expression que se evalúe como TRUE, el Motor de base de datos de SQL ServerSQL Server Database Engine devuelve la else_result_expression si se especifica una cláusula ELSE, o bien 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 buscada:Searched CASE expression:
Evalúa, en el orden especificado, la Boolean_expression de cada cláusula WHEN.Evaluates, in the order specified, Boolean_expression for each WHEN clause.
Devuelve la result_expression de la primera Boolean_expression que se evalúa como TRUE.Returns result_expression of the first Boolean_expression that evaluates to TRUE.
Si no hay ninguna Boolean_expression que se evalúe como TRUE, el Motor de base de datosDatabase Enginedevuelve la else_result_expression si se especifica una cláusula ELSE, o bien 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.
ObservacionesRemarks
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 los 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 expresión CASE evalúa sus condiciones de forma secuencial y se detiene en la primera condición cuya condición se cumple.The CASE expression 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 expresión CASE reciba los resultados de la expresión como entrada.In some situations, an expression is evaluated before a CASE expression 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 expresión CASE se evalúan primero y, después, se proporcionan a la expresión CASE.Aggregate expressions that appear in WHEN arguments to a CASE expression are evaluated first, then provided to the CASE expression. 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 'Estados Unidos' 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, un representante de un proveedor o un consumidor.For example, the person may be an employee, vendor representative, or a customer. La función devuelve el nombre y el apellido de un BusinessEntityID
determinado y el tipo de contacto para esa persona. La expresión CASE en la instrucción SET determina el valor que se va a mostrar para la columna ContactType
según la existencia de la columna BusinessEntityID
en las tablas Employee
, Vendor
o Customer
.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 en la tabla HumanResources.Employee
.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: Azure Synapse AnalyticsAzure Synapse Analytics y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics 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
En una instrucción SELECT, la expresión CASE permite sustituir valores en el conjunto de resultados basándose en 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 este ejemplo se usa 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. Cuando un valor no existe, aparece el texto “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. 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;
Consulte 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)
CHOOSE (Transact-SQL)CHOOSE (Transact-SQL)