A instrução SQL Server (2008 ou 2012, especificamente) CASE
avalia todas as WHEN
condições ou sai quando encontra uma WHEN
cláusula avaliada como verdadeira? Se ele passar por todo o conjunto de condições, isso significa que a última condição avaliada como verdadeira substitui o que a primeira condição avaliada como verdadeira fez? Por exemplo:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
O resultado é "SIM" mesmo que a última condição quando deva fazer com que seja avaliado como "NÃO". Parece que ele sai assim que encontra a primeira condição TRUE. Alguém pode confirmar se é o caso .
•Retorna a expressão_resultado da primeira expressão_entrada = quando_expressão que é avaliada como TRUE .
Referência https://learn.microsoft.com/sql/t-sql/language-elements/case-transact-sql
Este é o comportamento padrão do SQL:
Uma
CASE
expressão é avaliada para a primeira condição verdadeira.Se não houver uma condição verdadeira, ele avalia a
ELSE
peça.Se não houver condição verdadeira e nenhuma
ELSE
parte, ela será avaliada comoNULL
.O SQL Server geralmente faz avaliação de curto-circuito para instruções CASE ( SQLFiddle ):
No entanto, existem vários tipos de instruções que, a partir do SQL Server 2012, não causam curto-circuito corretamente. Veja o link do ypercube nos comentários.
Oracle sempre faz avaliação de curto-circuito . Consulte a Referência de linguagem SQL 11.2 . Ou compare o seguinte ( SQLFiddle ):
Este mesmo teste não pode ser feito com o MySQL porque retorna NULL para divisão por zero. ( SQL violino )
Parece que o MS SQL Server também usa uma avaliação de curto-circuito.
No teste a seguir eu tenho 3 testes. O primeiro é sempre verdadeiro, o segundo falha sem fazer referência à tabela e o terceiro falha apenas quando os dados são levados em consideração.
Nesta execução específica, ambas as linhas são retornadas com sucesso. Se eu comentar o primeiro QUANDO, ou o primeiro e o segundo, recebo falhas.
se a instrução case usada na
WHERE
condição e a primeira instrução case when envolverem a avaliação de valores de coluna da tabela, e a primeira linha da tabela não atender a essa condição, a instrução case irá para a instrução case when seguinte.