Problema:
Quiere usar una instrucción CASE en SQL.
Ejemplo:
Tiene resultados de exámenes en el exam
mesa. Debe asignar cada resultado a uno de los siguientes valores de texto:'bad result'
, 'average result'
, o 'good result'
. Los malos resultados son aquellos por debajo de 40, los buenos resultados son aquellos por encima de 70 y el resto son resultados promedio.
El exam
la tabla se ve así:
nombre | resultado |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Carril Sloan | 70 |
Steff Fox | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Solución 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
La tabla de resultados se ve así:
nombre | resultado | categoría |
---|---|---|
Toby Shaw | 56 | resultado promedio |
Casey Watson | 49 | resultado promedio |
Bennie Lynn | 23 | mal resultado |
Carril Sloan | 70 | resultado promedio |
Steff Fox | 85 | buen resultado |
Reggie Ward | 40 | resultado promedio |
Gail Kennedy | 66 | resultado promedio |
Brice Mueller | 90 | buen resultado |
Discusión:
Para mostrar un valor basado en su(s) condición(es) específica(s), debe escribir un CASE
declaración. La sintaxis es:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Si condition_1
se cumple, entonces el valor recuperado es value_1
. De lo contrario, la base de datos busca condition_2
. Si condition_2
es verdadero, entonces el valor obtenido es value_2
. Si no se cumple ninguna de estas condiciones, SQL verifica las condiciones restantes una por una en orden hasta que se cumpla una de las condiciones. Si no se cumple ninguna de las condiciones, el value_n
especificado después de ELSE
se recupera.
El ELSE
parte es opcional. Si lo omite y no se cumple ninguna de las condiciones, obtiene un NULL
.
Recuerda END
el CASE
cláusula cuando haya terminado con todas las condiciones. Por supuesto, al igual que con cualquier columna que cree, puede cambiarle el nombre (AS <column_name>
).
En nuestro ejemplo, 'bad result'
se asigna cuando result < 40, and 'good result'
se asigna cuando result > 70
. Si no se cumple ninguna de estas condiciones, el valor es 'average result'
. Además, para nombrar la columna recién creada de los valores de texto, debe usar un alias (AS
categoría). Así es como obtienes:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Desde 'average result'
se asigna a resultados entre 40
y 70
(inclusive), también puede escribir una condición en lugar de ELSE
(consulte la Solución 2 a continuación). Sin embargo, es más fácil usar ELSE
.
Solución 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;>
La tabla de resultados se ve así:
nombre | resultado | categoría |
---|---|---|
Toby Shaw | 56 | resultado promedio |
Casey Watson | 49 | resultado promedio |
Bennie Lynn | 23 | mal resultado |
Carril Sloan | 70 | resultado promedio |
Steff Fox | 85 | buen resultado |
Reggie Ward | 40 | resultado promedio |
Gail Kennedy | 66 | resultado promedio |
Brice Mueller | 90 | buen resultado |
Discusión:
Desde 'average result'
se asigna a resultados entre 40
y 70
(inclusive), puede escribir la siguiente condición en lugar de ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Si no usa un ELSE
y no quiero ningún NULL
s en la category
columna, debe asegurarse de cuidar todos los result
posibles valores. Si hay un result
que no cumple ninguna de las condiciones, obtienes un NULL
.
Solución 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
La tabla de resultados se ve así:
nombre | resultado | categoría |
---|---|---|
Toby Shaw | 56 | resultado promedio |
Casey Watson | 49 | resultado promedio |
Bennie Lynn | 23 | mal resultado |
Carril Sloan | 70 | resultado promedio |
Steff Fox | 85 | buen resultado |
Reggie Ward | 40 | resultado promedio |
Gail Kennedy | 66 | resultado promedio |
Brice Mueller | 90 | buen resultado |
Discusión:
Las condiciones especificadas en CASE
puede no superponerse como en las soluciones anteriores o superponerse como en esta solución. La primera condición es la misma que antes:para result < 40
, la category
es 'bad result'
. Todos los resultados por debajo de 40
se les asigna este valor en este punto y ya no necesita hacer nada con ellos. Esto significa que no hay necesidad de asegurarse de que result >= 40
al especificar las condiciones para el 'average result'
– todos los resultados inferiores a 40 ya tienen el valor 'bad result'
asignado. Finalmente, para los resultados restantes, la categoría debe ser 'good result'
; un simple ELSE 'good result'
lo cuida Así es como obtienes:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Nota:El orden de las condiciones en CASE
asuntos. Si invierte el orden de las dos primeras condiciones (es decir, si especifica WHEN result <= 70 THEN 'average result'
primero luego WHEN result <= 70 THEN 'average result'
segundo), todos los resultados menores o iguales a 70
terminar en el 'average result'
categoría, sin resultados asignados al 'bad result'
categoría.