Buscar..
Introducción
La expresión CASE se utiliza para implementar la lógica if-then.
Sintaxis
- CASE input_expression
CUÁNDO comparar1 ENTONCES resultado1
[CUANDO compare2 ENTONCES result2] ...
[ELSE resultx]
FIN - CASO
CUANDO condiciona1 ENTONCES resultado1
[CUANDO condicion2 LUEGO result2] ...
[ELSE resultx]
FIN
Observaciones
La expresión CASE simple devuelve el primer resultado cuyo valor compareX
es igual a input_expression
.
La expresión CASE buscada devuelve el primer resultado cuya conditionX
X es verdadera.
CASO buscado en SELECCIONAR (coincide con una expresión booleana)
El CASE buscado devuelve resultados cuando una expresión booleana es VERDADERA.
(Esto difiere del caso simple, que solo puede verificar la equivalencia con una entrada).
SELECT Id, ItemId, Price,
CASE WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
Carné de identidad | Identificación del artículo | Precio | Precio |
---|---|---|---|
1 | 100 | 34.5 | COSTOSO |
2 | 145 | 2.3 | BARATO |
3 | 100 | 34.5 | COSTOSO |
4 | 100 | 34.5 | COSTOSO |
5 | 145 | 10 | ASEQUIBLE |
Use CASO para CONTAR el número de filas en una columna que coincida con una condición.
Caso de uso
CASE
se puede usar junto con SUM
para devolver un recuento de solo aquellos elementos que coinciden con una condición predefinida. (Esto es similar a COUNTIF
en Excel.)
El truco es devolver resultados binarios que indiquen coincidencias, por lo que los "1" devueltos para las entradas coincidentes se pueden sumar para un recuento del número total de coincidencias.
Dada esta tabla de ItemSales
, supongamos que desea conocer el número total de artículos que se han categorizado como "Caros":
Carné de identidad | Identificación del artículo | Precio | Precio |
---|---|---|---|
1 | 100 | 34.5 | COSTOSO |
2 | 145 | 2.3 | BARATO |
3 | 100 | 34.5 | COSTOSO |
4 | 100 | 34.5 | COSTOSO |
5 | 145 | 10 | ASEQUIBLE |
Consulta
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Resultados:
ArtículosCuenta | ExpensiveItemsCount |
---|---|
5 | 3 |
Alternativa:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
CASTILLO ABREVIADO en SELECCIONAR
La variante abreviada de CASE
evalúa una expresión (generalmente una columna) contra una serie de valores. Esta variante es un poco más corta y guarda la repetición de la expresión evaluada una y otra vez. La cláusula ELSE
todavía se puede utilizar, sin embargo:
SELECT Id, ItemId, Price,
CASE Price WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
Una palabra de precaución. Es importante darse cuenta de que cuando se usa la variante corta, la declaración completa se evalúa en cada WHEN
. Por lo tanto la siguiente declaración:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
puede producir un resultado NULL
. Esto se debe a que en cada WHEN
NEWID()
se llama de nuevo con un nuevo resultado. Equivalente a:
SELECT
CASE
WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
END
Por lo tanto, puede pasar por alto todos los casos de WHEN
y el resultado es NULL
CASO en una cláusula ORDENAR POR
Podemos usar 1,2,3 .. para determinar el tipo de orden:
SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
WHEN 'MARKETING' THEN 1
WHEN 'SALES' THEN 2
WHEN 'RESEARCH' THEN 3
WHEN 'INNOVATION' THEN 4
ELSE 5
END,
CITY
CARNÉ DE IDENTIDAD | REGIÓN | CIUDAD | DEPARTAMENTO | EMPLEADOS_NUMBER |
---|---|---|---|---|
12 | Nueva Inglaterra | Bostón | MÁRKETING | 9 |
15 | Oeste | San Francisco | MÁRKETING | 12 |
9 | Medio oeste | Chicago | VENTAS | 8 |
14 | Atlántico medio | Nueva York | VENTAS | 12 |
5 | Oeste | los Angeles | INVESTIGACIÓN | 11 |
10 | Atlántico medio | Filadelfia | INVESTIGACIÓN | 13 |
4 | Medio oeste | Chicago | INNOVACIÓN | 11 |
2 | Medio oeste | Detroit | RECURSOS HUMANOS | 9 |
Usando CASE en ACTUALIZAR
muestra sobre aumentos de precios:
UPDATE ItemPrice
SET Price = Price *
CASE ItemId
WHEN 1 THEN 1.05
WHEN 2 THEN 1.10
WHEN 3 THEN 1.15
ELSE 1.00
END
Uso de CASE para valores NULOS ordenados en último lugar
de esta manera, el '0' que representa los valores conocidos se clasifica primero, el '1' que representa los valores NULL se ordenan por el último:
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
CARNÉ DE IDENTIDAD | REGIÓN | CIUDAD | DEPARTAMENTO | EMPLEADOS_NUMBER |
---|---|---|---|---|
10 | Atlántico medio | Filadelfia | INVESTIGACIÓN | 13 |
14 | Atlántico medio | Nueva York | VENTAS | 12 |
9 | Medio oeste | Chicago | VENTAS | 8 |
12 | Nueva Inglaterra | Bostón | MÁRKETING | 9 |
5 | Oeste | los Angeles | INVESTIGACIÓN | 11 |
15 | NULO | San Francisco | MÁRKETING | 12 |
4 | NULO | Chicago | INNOVACIÓN | 11 |
2 | NULO | Detroit | RECURSOS HUMANOS | 9 |
CASO en la cláusula ORDER BY para ordenar los registros por el valor más bajo de 2 columnas
Imagine que necesita ordenar los registros por el valor más bajo de una de las dos columnas. Algunas bases de datos podrían usar una función MIN()
o LEAST()
no agregada para esto ( ... ORDER BY MIN(Date1, Date2)
), pero en SQL estándar, tiene que usar una expresión CASE
.
La expresión CASE
en la consulta siguiente examina las columnas Date1
y Date2
, verifica qué columna tiene el valor más bajo y ordena los registros según este valor.
Data de muestra
Carné de identidad | Fecha 1 | Fecha 2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
2 | 2017-01-31 | 2017-01-03 |
3 | 2017-01-31 | 2017-01-02 |
4 | 2017-01-06 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
6 | 2017-01-04 | 2017-01-31 |
Consulta
SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE
WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1
ELSE Date2
END
Resultados
Carné de identidad | Fecha 1 | Fecha 2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
3 | 2017-01-31 | 2017-01-02 |
2 | 2017-01-31 | 2017-01-03 |
6 | 2017-01-04 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
4 | 2017-01-06 | 2017-01-31 |
Explicación
Como ve, la fila con Id = 1
es la primera, porque debido a que Date1
tiene el registro más bajo de toda la tabla 2017-01-01
, la fila donde Id = 3
es la segunda, porque Date2
es igual a 2017-01-02
que es el segundo valor más bajo de la tabla y así.
Por lo tanto, hemos ordenado los registros de 2017-01-01
a 2017-01-06
ascendentes y no nos importa en qué columna Date1
o Date2
son esos valores.