A instrução do 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 sendo a última condição em que deve avaliar como "NÃO". Parece que sai depois de encontrar a primeira condição VERDADEIRA. Alguém pode confirmar se é esse o caso .
sql-server
t-sql
case
Juan Velez
fonte
fonte
COALESCE()
é traduzida para umaCASE
expressão.)Respostas:
• Retorna a expressão result_ da primeira expressão input_ = when_expression que é avaliada como TRUE .
Referência http://msdn.microsoft.com/en-us/library/ms181765.aspx
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, ela avalia a
ELSE
peça.Se não houver uma condição verdadeira e nenhuma
ELSE
parte, ela será avaliada comoNULL
.fonte
O SQL Server geralmente faz uma avaliação de curto-circuito para instruções CASE ( SQLFiddle ):
No entanto, existem vários tipos de instruções que, no SQL Server 2012, não causam um curto-circuito correto. Veja o link do ypercube nos comentários.
A Oracle sempre faz avaliação de curto-circuito . Consulte a Referência da 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 Fiddle )
fonte
Parece que o MS SQL Server também usa uma avaliação de curto-circuito.
No teste a seguir, 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, as duas linhas são retornadas com sucesso. Se eu comentar o primeiro WHEN, ou o primeiro e o segundo, recebo falhas.
fonte
se a instrução de caso usada na
WHERE
condição e o primeiro caso quando envolver envolver 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 de caso passará para o caso seguinte quando instrução.fonte
No MySQL, ele sairá da instrução case na primeira opção verdadeira. Se você tem a possibilidade de vários valores verdadeiros, deseja colocar a resposta preferida anteriormente na sequência.
fonte