Personas que lo han encontrado til: 3 de 4 - Valorar este tema Evala una lista de condiciones y devuelve una de las varias expresiones de resultado posibles. La expresin CASE tiene dos formatos: La expresin CASE sencilla compara una expresin con un conjunto de expresiones sencillas para determinar el resultado. La expresin CASE buscada evala un conjunto de expresiones booleanas para determinar el resultado.
Ambos formatos admiten un argumento ELSE opcional. CASE se puede utilizar en cualquier instruccin o clusula que permite una expresin vlida. Por ejemplo, puede utilizar CASE en instrucciones como SELECT, UPDATE, DELETE y SET, y en clusulas como select_list, IN, WHERE, ORDER BY y HAVING. Convenciones de sintaxis de Transact-SQL
Sintaxis
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
Argumentos
input_expression Es la expresin evaluada cuando se utiliza el formato CASE sencillo. input_expression es cualquier expresin vlida. WHEN when_expression
Es una expresin sencilla con la que se compara input_expression cuando se utiliza el formato CASE sencillo. when_expression es cualquier expresin vlida. Los tipos de datos de input_expression y cada when_expression deben ser iguales o deben ser una conversin implcita. THEN result_expression Es la expresin devuelta cuando input_expression es igual que when_expression se evala como TRUE o Boolean_expression se evala como TRUE. result expression es cualquier expresin vlida. ELSE else_result_expression Es la expresin que se devuelve si ninguna comparacin se evala como TRUE. Si se omite este argumento y ninguna comparacin se evala como TRUE, CASE devuelve NULL. else_result_expression es cualquier expresin vlida. Los tipos de datos de else_result_expression y cualquier result_expression deben ser iguales o deben ser una conversin implcita. WHEN Boolean_expression Es la expresin booleana que se evala cuando se utiliza el formato CASE de bsqueda. Boolean_expression es cualquier expresin booleana vlida.
Valores devueltos
Expresin CASE simple: La expresin CASE simple compara la primera expresin con la expresin de cada clusula WHEN para determinar si se da alguna equivalencia. Si estas expresiones son equivalentes, se devolver la expresin de la clusula THEN. Permite solo una comprobacin de igualdad. Evala input_expression y, en el orden especificado, la expresin input_expression = when_expression para cada clusula WHEN. Devuelve result_expression de la primera input_expression = when_expression que se evala como TRUE. Si input_expression = when_expression no se evala como TRUE, Motor de base de datos de SQL Server devuelve else_result_expression si se especifica una clusula ELSE, o bien un valor NULL si no se especifica ninguna clusula ELSE.
Expresin CASE buscada: Evala, en el orden especificado, Boolean_expression para cada clusula WHEN. Devuelve result_expression de la primera Boolean_expression que se evala como TRUE. Si Boolean_expression se evala como TRUE, Motor de base de datos devuelve else_result_expression si se especifica una clusula ELSE, o bien un valor NULL si no se especifica ninguna clusula ELSE.
Comentarios
SQL Server solo permite 10 niveles de anidamiento en las expresiones CASE. La expresin CASE no se puede utilizar para controlar el flujo de ejecucin de los bloques de instrucciones, funciones definidas por el usuario, procedimientos almacenados e instrucciones de Transact-SQL. Para obtener una lista de los mtodos de control de flujo, vea Lenguaje de control de flujo (Transact-SQL). La instruccin CASE devuelve las condiciones de forma secuencial y se detiene en la primera condicin cuya condicin se cumple. En algunas situaciones, se evala una expresin antes de que una instruccin CASE reciba los resultados de la expresin como entrada. Los errores de evaluacin de estas expresiones son posibles. Las expresiones de agregado que aparecen en los argumentos WHEN para una instruccin CASE se evalan primero y, a continuacin, se proporcionan a la instruccin CASE. Por ejemplo, la siguiente consulta genera un error de divisin por cero al obtener el valor de agregado MAX. Esto ocurre antes de evaluar la expresin CASE. Transact-SQL 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 evaluacin de las condiciones WHEN para las expresiones escalares (incluidas las subconsultas no correlacionadas que devuelven escalares), no para las expresiones de agregado.
Ejemplos
Transact-SQL 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
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.Usar CASE para reemplazar la funcin IIf que se utiliza en Microsoft Access
CASE proporciona una funcionalidad similar a la funcin IIf de Microsoft Access. En el ejemplo siguiente se muestra una consulta sencilla que utiliza IIf para proporcionar un valor de salida para la columnaTelephoneInstructions en una tabla de Access denominada db1.ContactInfo. SELECT FirstName, LastName, TelephoneNumber, IIf(IsNull(TelephoneInstructions),"Any time", TelephoneInstructions) AS [When to Contact] FROM db1.ContactInfo; En el siguiente ejemplo se usa CASE para proporcionar un valor de salida para la columna TelephoneSpecialInstructions de la vista AdventureWorks2012 , Person.vAdditionalContactInfo. Transact-SQL USE AdventureWorks2012; GO SELECT FirstName, LastName, TelephoneNumber, "When to Contact" = CASE WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time' ELSE TelephoneSpecialInstructions END FROM Person.vAdditionalContactInfo;
Transact-SQL SELECT BusinessEntityID, SalariedFlag FROM HumanResources.Employee ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END; GO
Transact-SQL 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;
columna ContactType segn la existencia de la columnaBusinessEntityID en las tablas Employee, Vendor o Customer. Transact-SQL 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);