Database
 sql >> Base de Dados >  >> RDS >> Database

Como escrever uma instrução CASE em SQL

Problema:


Você deseja usar uma instrução CASE em SQL.

Exemplo:


Você tem resultados de exames no exam tabela. Você precisa atribuir cada resultado a um dos seguintes valores de texto:'bad result' , 'average result' , ou 'good result' . Maus resultados são aqueles abaixo de 40, bons resultados são aqueles acima de 70, e o resto são resultados médios.

O exam tabela fica assim:
nome resultado
Toby Shaw 56
Casey Watson 49
Bennie Lynn 23
Lane Sloan 70
Steff Fox 85
Reggie Ward 40
Gail Kennedy 66
Brice Mueller 90

Solução 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;

A tabela de resultados fica assim:
nome resultado categoria
Toby Shaw 56 resultado médio
Casey Watson 49 resultado médio
Bennie Lynn 23 resultado ruim
Lane Sloan 70 resultado médio
Steff Fox 85 bom resultado
Reggie Ward 40 resultado médio
Gail Kennedy 66 resultado médio
Brice Mueller 90 bom resultado

Discussão:


Para exibir um valor com base em suas condições específicas, você precisa escrever um CASE demonstração. A sintaxe é:
CASE
  WHEN  THEN ,
  WHEN  THEN ,
  …
  ELSE 
END AS 

Se condition_1 for atendido, o valor recuperado será value_1 . Caso contrário, o banco de dados verifica se há condition_2 . Se condition_2 for true, o valor recuperado será value_2 . Se nenhuma dessas condições for atendida, o SQL verificará as condições restantes uma a uma em ordem até que uma das condições seja atendida. Se nenhuma das condições for atendida, o value_n especificado após o ELSE é recuperado.

O ELSE parte é opcional. Se você omitir e nenhuma das condições for atendida, você obterá um NULL .

Lembre-se de END o CASE cláusula quando terminar com todas as condições. Claro, como com qualquer coluna que você cria, você pode renomeá-la (AS <column_name> ).

Em nosso exemplo, 'bad result' é atribuído quando result < 40, and 'good result' é atribuído quando result > 70 . Se nenhuma dessas condições for atendida, o valor será 'average result' . Além disso, para nomear a coluna recém-criada dos valores de texto, você precisa usar um alias (AS categoria). É assim que você obtém:
  CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result > 70 THEN 'good result'
    ELSE 'average result'
  END AS category

Desde 'average result' é atribuído a resultados entre 40 e 70 (inclusive), você também pode escrever uma condição em vez de ELSE (veja a Solução 2 abaixo). No entanto, é mais fácil usar ELSE .

Solução 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;

A tabela de resultados fica assim:
nome resultado categoria
Toby Shaw 56 resultado médio
Casey Watson 49 resultado médio
Bennie Lynn 23 resultado ruim
Lane Sloan 70 resultado médio
Steff Fox 85 bom resultado
Reggie Ward 40 resultado médio
Gail Kennedy 66 resultado médio
Brice Mueller 90 bom resultado

Discussão:


Desde 'average result' é atribuído a resultados entre 40 e 70 (inclusive), você pode escrever a seguinte condição em vez de um ELSE :
WHEN result >= 40 AND result <= 70 THEN 'average result'

Se você não usar um ELSE e não quer nenhum NULL s na category coluna, você precisa ter certeza de cuidar de todos os possíveis result valores. Se houver um result que não atende a nenhuma das condições, você obtém um NULL .

Solução 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;

A tabela de resultados fica assim:
nome resultado categoria
Toby Shaw 56 resultado médio
Casey Watson 49 resultado médio
Bennie Lynn 23 resultado ruim
Lane Sloan 70 resultado médio
Steff Fox 85 bom resultado
Reggie Ward 40 resultado médio
Gail Kennedy 66 resultado médio
Brice Mueller 90 bom resultado

Discussão:


As condições especificadas em CASE pode ser não sobreposto como nas soluções anteriores ou sobreposto como nesta solução. A primeira condição é a mesma de antes – para result < 40 , a category é 'bad result' . Todos os resultados abaixo de 40 são atribuídos a esse valor neste momento e você não precisa mais fazer nada com eles. Isso significa que não há necessidade de garantir que result >= 40 ao especificar as condições para o 'average result' – todos os resultados inferiores a 40 já têm o valor 'bad result' atribuído. Finalmente, para os resultados restantes a categoria deve ser 'good result'; um simples ELSE 'good result' cuida disso. É assim que você obtém:
CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result <= 70 THEN 'average result'
    ELSE 'good result'
END AS category

Nota:A ordem das condições em CASE assuntos. Se você inverter a ordem das duas primeiras condições (ou seja, se você especificar WHEN result <= 70 THEN 'average result' primeiro então WHEN result <= 70 THEN 'average result' segundo), todos os resultados menores ou iguais a 70 acabam no 'average result' categoria, sem resultados atribuídos ao 'bad result' categoria.