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.