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 WHENTHEN , 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.