sql >> Base de Datos >  >> RDS >> Database

Cómo escribir una instrucción CASE en SQL

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
  WHEN  THEN ,
  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.