La expresión CASE se utiliza para implementar la lógica si-entonces.
Sintaxis
CASE expresión_entrada
WHEN
compara1 THEN resultado1
[WHEN
compara2 THEN resultado2]...
[ELSE
resultadoX]
END
CASE
WHEN
condicion1 THEN resultado1
[WHEN
condicion2 THEN resultado2]...
[ELSE
resultadoX]
Observaciones
La expresión CASE simple devuelve el primer resultado cuyo valor comparaX es igual a la expresión_entrada.
La expresión CASE buscada devuelve el primer resultado cuya condiciónX es verdadera.
Ejemplo
El CASE buscado en la SELECT (Coincide con una expresión booleana) y devuelve resultados cuando una expresión booleana es VERDADERA. (Esto difiere del caso simple, en el que sólo se puede verificar la equivalencia con una entrada).
SELECT
Id, IdArticulo, Precio,
CASE WHEN
Precio < 10 THEN 'BARATO'
WHEN
Precio < 20 THEN 'ALCANZABLE'
ELSE 'CARO'
END AS RangoPrecio
FROM Precio_Articulos
Devolverá un resultado de este estilo:d ItemId Price PriceRating
1 100
34.5 CARO
2 145 2.3
BARATO
3 100
34.5 CARO
4 100
34.5 CARO
5 145 10 ALCANZABLE
SUM y CASE
Utilizaremos SUM junto con CASE para contar el número de filas en una columna que cumpla una condición.
CASE se puede utilizar junto con SUM para devolver un recuento de solo aquellos elementos que coincidan con una condición predefinida. El truco consiste en devolver resultados binarios que indiquen coincidencias, de modo que se devuelvan "1" para las entradas coincidentes. Se puede sumar para contar el número total de coincidencias. Dada la siguiente tabla Precio_Articulos, digamos que deseamos conocer el número total de artículos que se han categorizado como "CARO":
SELECT
COUNT(Id)
AS CuentaArticulos,
SUM (
CASE
WHEN RangoPrecio
= 'CARO' THEN 1
ELSE 0
END
) AS CUENTA_CAROS
FROM Precio_Articulos
Query Alternativa:
SELECT
COUNT(Id)
as CuentaArticulos,
SUM (CASE
RangoPrecio
WHEN 'CARO'
THEN 1
ELSE 0
END
) AS CUENTA_CAROS
FROM Precio_Articulos
Abreviar CASE en una SELECT
Esta variante abreviada de CASE evalúa una expresión (normalmente una columna) frente a una serie de valores. Esta variante es un poco más corta y evita repetir la expresión evaluada una y otra vez. Además aún se puede utilizar la cláusula ELSE:
SELECT
Id, ArticuloId, Precio,
CASE Precio
WHEN 5 THEN 'BARATO'
WHEN 15
THEN 'ALCANZABLE'
ELSE 'CARO'
END as RangoPrecio
FROM Precio_Articulos
Un poco de precaución, pues hay que tener en cuenta de que cuando se utiliza la variante corta, la declaración completa es evaluada en cada WHEN. Por ello la siguiente query:
SELECT
CASE
ABS(CHECKSUM(NEWID())) % 4
WHEN 0
THEN 'Dr'
WHEN 1
THEN 'Master'
WHEN 2
THEN 'Mr'
WHEN 3
THEN 'Mrs'
END
Esta
query puede producir un resultado NULL. Esto
se debe a que en cada WHEN, la clausula NEWID() se vuelve a llamar con un nuevo
resultado.
Es mejor utilizar esta query equivalente:
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, se pueden omitir todos los casos WHEN y dar como resultado NULL.
Usando CASE en una cláusula UPDATE
Muestra sobre aumentos de precios:
UPDATE Tabla_Precios
SET Price
= Precio *
CASE Id_Articulo
WHEN 1
THEN 1.05
WHEN 2
THEN 1.10
WHEN 3
THEN 1.15
ELSE 1.00
END
Usando CASE en la cláusula ORDER BY
CASE ordena en último lugar los valores NULL de modo que, '0' representa los valores conocidos y se clasifican en primer lugar, mientras que '1' representa los valores NULL y se clasifican en último lugar:
SELECT ID,
REGION, CIUDAD, DEPARTAMENTO, NUMERO_EMPLEADO
FROM TABLA_DEPARTAMENTOS
ORDER BY
CASE WHEN
REGION IS NULL THEN 1
ELSE 0
END,
REGION
Este es
un ejemplo del resultado que podría dar:
ID REGION
CITY DEPARTMENT EMPLOYEES_NUMBER
10 Andalucía
Almería INVESTIGACION 13
14 Andalucía
Ecija VENTAS 12
9 Cantabria
Torrelavega VENTAS 8
12 Castilla
la Mancha Toledo MARKETING 9
5 La
Rioja Arnedo INVESTIGACION 11
15 NULL Torrejon
de Ardoz MARKETING 12
4 NULL Zaragoza
INNOVACION 11
2 NULL Requena RECURSOS HUMANOS 9
Para ordenar registros por el valor más bajo de 2 columnas
Vamos a imaginar que necesitamos ordenar registros por el valor más bajo de cualquiera de las dos columnas. Algunas bases de datos podrían usar una función MIN() o LEAST() de este modo (... ORDER BY MIN(Fecha1, Fecha2)), pero en SQL estándar, debemos utilizar una expresión CASE. La expresión CASE en la consulta siguiente mira las columnas Fecha1 y Fecha2, y verifica cuál tiene el valor más bajo y ordena los registros según este valor.
Por ejemplo, dados estos datos: Las
fechas están en formato inglés AAAA-MM-DD
d ate1
Date2
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
Utilizamos esta
query
SELECT
Id, Fecha1, Fecha2
FROM Tabla_Fechas
ORDER BY
CASE
WHEN
COALESCE(Fecha1, '2000-01-01') < COALESCE(Fecha2, '2000-01-01') THEN Fecha1
ELSE Fecha2
END
El
resultado sería este:
Id Date1
Date2
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
Como se puede ver, la fila con Id =
1 es la primera, debido a que Fecha1 tiene el registro más bajo de toda la
tabla 2017. (01-01), la fila Id = 3 es la segunda porque Fecha2 es igual a
2017-01-02, que es el segundo valor más bajo de la tabla, etc.
Así que hemos ordenado los registros
del 2017-01-01 al 2017-01-06 de forma ascendente y no nos importa si el valor
se encuentra en la columna Fecha1 o en Fecha2.
No hay comentarios:
Publicar un comentario