Estructura Case

Estructura Case en SQL Server

Evalua una expresión condicional y retorna uno de múltiples resultados.

La estructura Case tiene dos formas:

  1. La expresión CASE simple compara una expresión con un conjunto de expresiones simples para determinar el resultado.
  2. La expresión CASE buscada evalúa un conjunto de expresiones booleanas para determinar el resultado.

Ambos formatos admiten un argumento ELSE opcional.

Importante:

  • CASE se puede usar en cualquier declaración o cláusula que permita una expresión válida.
  • La estructura CASE se puede usar en SELECT, UPDATE, DELETE y SET.
  • También se puede usar en la lista de campos de la instrucción Select y el las expresiones con el operador IN (Ver Operadores en SQL Server) y las cláusulas  WHERE  (Ver Filtrado de datos), ORDER BY (Ver Ordenamientos) y HAVING (Ver Filtros Having).

    Sintaxis

Extructura CASE simple

CASE input_expression
WHEN when_expression THEN result_expression [ …n ]
[ ELSE else_result_expression ]
END

Estructura Case buscada

CASE
WHEN Boolean_expression THEN result_expression [ …n ]
[ ELSE else_result_expression ]
END

Ejemplos

1. Usar Case para mostrar el nombre de la estación del año, las opciones posible son Verano, Otoño, Invierno, Primavera. (Ver Funciones de Fecha)

select Case Datepart(q, GetDate())
When 1 then ‘Verano’
When 2 then ‘Otoño’
When 3 then ‘Invierno’
Else ‘Primavera’
End

2. Listado de los empleados y su estación en que nacieron. Para la estación se usará una Subconsulta. (Ver SubConsultas)

use Northwind
go

select e1.EmployeeID, E1.LastName, E1.FirstName,
(Select Case Datepart(q, E.BirthDate)
When 1 then ‘Verano’
When 2 then ‘Otoño’
When 3 then ‘Invierno’
Else ‘Primavera’ End
from Employees As E where E.EmployeeID = E1.EmployeeID)
As ‘Estación’
from Employees As E1
go

3. Usando AdventureWorks, mostrar los productos y la descripción de la Línea a la que pertenecen.
Las descripciones de las líneas tiene una propiedad con los valores R = Road, M = Mountain, T = Touring, S = Standard. Esta estructura Case muestra una Expresión Simple.

USE AdventureWorks
go
SELECT P.ProductID As ‘Código’, P.ProductNumber As ‘Nº Producto’, P.Name As ‘Descripción’,
Categoría = CASE P.ProductLine
WHEN ‘R’ THEN ‘Road’
WHEN ‘M’ THEN ‘Mountain’
WHEN ‘T’ THEN ‘Touring’
WHEN ‘S’ THEN ‘Standard’
ELSE ‘No en venta’
END
FROM Production.Product As P
ORDER BY ProductNumber
go

4. Usando Northwind, crear un listado de los productos y establecer los rangos de sus precios.
Este ejercicio muestra una estructura Case con Expresión buscada.

USE Northwind
go
SELECT P.ProductID as ‘Código’, P.ProductName As ‘Descripción’,
P.UnitPrice as ‘Precio’,
‘Rango de Precios’ =
CASE
WHEN P.UnitPrice = 0 THEN ‘Precio no disponible’
WHEN P.UnitPrice < 20 THEN ‘Menor a 20’
WHEN P.UnitPrice >= 20 and P.UnitPrice < 50 THEN ‘Menor a 50’
WHEN P.UnitPrice >= 50 and P.UnitPrice < 100 THEN ‘Menor 100’
ELSE ‘Sobre 100’
END
FROM Products As P
go

Case en una instrucción Update

5. Usando Northwind, crear una Tabla con los Empleados y la cantidad de órdenes generadas. (Ver Joins y Funciones de Agregado)
Luego agregar un campos para insertar una calificación de acuerdo a lo siguiente:
Si tiene 100 o más órdenes: Cobertura Cumplida
Si tiene entre 60 y 99: Revisión de planes
Si tiene menos de 60: Reingeniería urgente

Primero generar la tabla

If exists (select * from sys.tables where name = ‘EmpleadosCantidadOrdenes’)
Begin
drop table EmpleadosCantidadOrdenes
End
select E.EmployeeID As ‘Código Empleado’,
Empleado = E.LastName + Space(1) + E.FirstName,
Count(O.OrderID) As ‘Cantidad de órdenes’,
Calificación = Space(20)
into EmpleadosCantidadOrdenes
from Employees As E
join Orders As O on E.EmployeeID = O.EmployeeID
group by E.EmployeeID, E.LastName + Space(1) + E.FirstName
Order by [Cantidad de órdenes] desc
go

Visualizar los datos
select * from EmpleadosCantidadOrdenes
go

Actualizar la calificación
update EmpleadosCantidadOrdenes set Calificación =
( Case
when [Cantidad de órdenes]> = 100 then ‘Cobertura cumplida’
when [Cantidad de órdenes]> = 60 and [Cantidad de órdenes]<= 99 then ‘Revisión de planes’
when [Cantidad de órdenes]< 60 then ‘Reingeniería urgente’
End
)
go

Visualizar nuevamente los datos después de actualizados
select * from EmpleadosCantidadOrdenes
go