La declaración de la sentencia CASE en SQL retorna un valor en una condición especificada. Trataremos de usar una declaración de case en las consultas que fueron seleccionadas junto con la cláusula Where, Order By y Group By. A su vez se puede utilizar en la opción de Insertar declaración. En este artículo, vamos a desarrollar la declaración CASE y todos sus diferentes casos de uso.
Supongamos que se tiene una tabla que contiene el ProductID para todos los productos en una tienda pequeña. Y se desea tratar de obtener el Productname para un ProductID en particular.
Veamos el siguiente ejemplo; Vamos a declarar una variable la cual va a ser: @ProductID y le asignamos el valor 1. En la declaración del caso, vamos a definir las condiciones. el momento en el que se cumple una condición, se devuelve su valor correspondiente.
De la misma manera, si modificamos la condición en una declaración de case en SQL, se va a devolver la expresión apropiada. En el próximo ejemplo, lo que queremos obtener es el nombre del Producto para ProductID 4. Pero no cumple la condición de declaración del Case; por lo tanto, dio salida de la expresión Else.
Examinamos algunos ejemplos de la declaración del case en SQL. Antes de poder continuar, tiene que crear una tabla de muestre e inserte algunos registros en esa tabla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
USE [SQLShackDemo] GO CREATE TABLE dbo.Employee ( EmployeeID INT IDENTITY PRIMARY KEY, EmployeeName VARCHAR(100) NOT NULL, Gender VARCHAR(1) NOT NULL, StateCode VARCHAR(20) NOT NULL, Salary money NOT NULL, ) GO USE [SQLShackDemo] GO SET IDENTITY_INSERT [dbo].[Employee] ON GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (201, N'Jerome', N'M', N'FL', 83000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (202, N'Ray', N'M', N'AL', 88000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (203, N'Stella', N'F', N'AL', 76000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (204, N'Gilbert', N'M', N'Ar', 42000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (205, N'Edward', N'M', N'FL', 93000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (206, N'Ernest', N'F', N'Al', 64000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (207, N'Jorge', N'F', N'IN', 75000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (208, N'Nicholas', N'F', N'Ge', 71000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (209, N'Lawrence', N'M', N'IN', 95000.0000) GO INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (210, N'Salvador', N'M', N'Co', 75000.0000) GO SET IDENTITY_INSERT [dbo].[Employee] OFF GO |
Tenemos los siguientes registros en la tabla de empleados.
Distintos formatos de declaraciones CASE
Una simple expresión de declaración CASE
En este formato, vamos a evaluar una expresión contra múltiples valores. En una declaración de case simple, este va a evaluar todas las condiciones una por una. El momento en el que la condición y la expresión llegan a coincidir, se devuelve la expresión mencionada en la cláusula THEN.
A continuación, tenemos la siguiente sintaxis para una declaración de case en SQL con una expresión simple.
1 2 3 4 5 6 |
SELECT CASE Expression When expression1 Then Result1 When expression2 Then Result2 ... ELSE Result END |
Generalmente, vamos almacenando abreviaturas en una tabla en lugar de su forma completa. Como por ejemplo, en mi tabla de empleados, he utilizado las siguientes abreviaturas en Gender y StateCode. Quiero tratar de usar una declaración Case para poder devolver valores como el Masculino y el Femenino en la salida, envés de M y F.
Vaya a ejecutar el siguiente código y va a observar que estamos intentando evaluar el CASE Gender en esta consulta.
En la imagen que viene a continuación, se puede notar una diferencia en la salida utilizando una instrucción Case en SQL.
La declaración CASE y el operador de comparación
Vamos a explorar que en este formato de una declaración CASE en SQL, podemos ya evaluar una condición utilizando los operadores de comparación. Una vez que se vaya a cumplir esta condición, vamos a obtener una expresión de THEN correspondiente en la salida
Vamos a ver la siguiente sintaxis para la declaración de caso con un operador de comparación.
1 2 3 4 5 |
CASE WHEN ComparsionCondition THEN result WHEN ComparsionCondition THEN result ELSE other END |
Consideremos que obtenemos una banda salarial para cada designación. Si el salario de los empleados se encuentra entre un rango particular, tratemos de obtener una designación usando una declaración de Caso.
En la próxima consulta, vamos a utilizar un operador de comparación y evaluamos una expresión.
1 2 3 4 5 6 7 |
Select EmployeeName, CASE WHEN Salary >=80000 AND Salary <=100000 THEN 'Director' WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant' Else 'Director' END AS Designation from Employee |
En la imagen a continuación puede ver, que obtenemos la designación según la condición especificada en la declaración CASE.
Declaración de caso con orden por cláusula
También vamos a usar la declaración del case con orden por cláusula. En SQL, podemos utilizar la cláusula de Ordenar por para organizar los resultados en un orden ascendente o descendente.
Supongamos en otro ejemplo; Queremos tratar de organizar el resultado con el siguiente método.
- Para las empleadas, los salarios de los empleados deben venir en orden descendente
- Para el empleado masculino, debemos tratar de obtener los salarios de los empleados en orden ascendente
Trataremos de definir esta condición con una combinación de Ordenar por y Declaración de case. En la próxima consulta, puede ver que estamos especificando al mismo tiempo Ordenar por y Case. Vamos a definir las condiciones de ordenación en la expresión de mayúsculas y minúsculas.
1 2 3 4 5 6 |
Select EmployeeName,Gender,Salary from Employee ORDER BY CASE Gender WHEN 'F' THEN Salary End DESC, Case WHEN Gender='M' THEN Salary END |
En la salida, ya hemos satisfecho nuestro requisito de clasificación en orden ascendente o descendente
- Para las empleadas, el salario se muestra en orden descendente
- Para el empleado masculino, el salario se muestra en orden ascendente
Declaración de caso en SQL con grupo por cláusula
A su vez podemos utilizar una declaración de caso con la cláusula Group By. Supongamos que tenemos que agrupar a todos los empleados según su salario. Adicionalmente, tenemos que calcular el salario mínimo y máximo para un rango particular de empleados.
En la próxima consulta, puede ver que tenemos la cláusula Group By y la cual contiene la condición para tratar de obtener el resultado requerido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Select CASE WHEN Salary >=80000 AND Salary <=100000 THEN 'Director' WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant' Else 'Director' END AS Designation, Min(salary) as MinimumSalary, Max(Salary) as MaximumSalary from Employee Group By CASE WHEN Salary >=80000 AND Salary <=100000 THEN 'Director' WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant' Else 'Director' END |
Tenemos el próximo resultado de esta consulta. En este resultado, obtenemos el salario mínimo y máximo para una designación particular.
Declaración de actualización con una declaración de CASE
También podemos utilizar una declaración de case en SQL con la actualización de DML. Supongamos que vamos actualizar el código de estado de los empleados según las condiciones de la declaración del caso.
En el próximo código, vamos a tratar de actualizar el código de estado con la siguiente condición.
- Si el código de estado del empleado es AR,, actualice aFL
- Si el código de estado del empleado es GE, , actualice a AL
- Para todos los otros códigos de estado, actualice el valor a IN
Ejecute el próximo comando de actualización para poder cumplir nuestro requisito utilizando una declaración de case.
1 2 3 4 5 6 |
UPDATE employee SET StateCode = CASE StateCode WHEN 'Ar' THEN 'FL' WHEN 'GE' THEN 'AL' ELSE 'IN' END |
En el próximo resultado, puede apreciar el antiguo Statcode (lado izquierdo) y el Statecode actualizado para los empleados según nuestras condiciones en la declaración del caso.
Insertar declaración con declaración CASE
Podemos también insertar datos en tablas SQL con la ayuda de la declaración de caso en SQL. Asumamos que tenemos una aplicación la cual inserta datos en la tabla Empleados. Con la cual obtenemos los siguientes valores de género.
Value | Description | Required value in Employee table |
0 | Male Employee | M |
1 | Female Employee | F |
No queremos insertar el valor 0 y 1 para empleados masculinos y femeninos. Ya que necesitamos insertar los valores requeridos M y F para el género del empleado.
En la próxima consulta, especificamos cuales son las variables para almacenar valores de columna. En la declaración de inserción, se puede utilizar una declaración de caso para poder definir el valor correspondiente para insertar en la tabla de empleados. En la declaración de caso, hay que verificar los valores requeridos e insertar los valores de THENcon expresión en la tabla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Declare @EmployeeName varchar(100) Declare @Gender int Declare @Statecode char(2) Declare @salary money Set @EmployeeName='Raj' Set @Gender=0 Set @Statecode='FL' set @salary=52000 Insert into employee values (@EmployeeName, CASE @Gender WHEN 0 THEN 'M' WHEN 1 THEN 'F' end, @Statecode, @salary) |
En la captura de pantalla que se muestra a continuación, podemos ver que la fila recién insertada contiene Género M en lugar del valor 0.
Las limitaciones en una declaración de case
- No se puede controlar el flujo de ejecución de procedimientos almacenados, funciones usando una declaración de case en SQL
- Podemos tener múltiples condiciones en la declaración del case; No obstante, funciona en un modelo secuencial. Si se cumple una condición, deja de verificar otras condiciones
- No podemos utilizar una declaración de case para poder verificar valores NULL en una tabla
Conclusión
La declaración de caso en SQL nos proporciona flexibilidad para poder escribir T-SQL para consultas DDL y DML. También se puede agregar versatilidad a las consultas de SQL Server. Se debe practicar la declaración de case en sus consultas.
- INSERTAR EN SELECCIONAR la instrucción del resumen y ejemplos - November 5, 2019
- Descripción general de la cláusula PARTITION BY de SQL - November 4, 2019
- Funciones y formatos de SQL Convert Date - October 10, 2019