No SQL Server, o T-SQL
CASE
expression é uma expressão escalar que retorna um valor com base na lógica condicional. Ele avalia uma lista de condições e retorna um valor, com base no resultado dessas condições. De certa forma, o SQL Server
CASE
expressão é semelhante a IF...ELSE
. No entanto, CASE
permite que você verifique várias condições, enquanto IF...ELSE
não. Além disso, no SQL Server,
IF...ELSE
é uma palavra-chave de linguagem de controle de fluxo, enquanto CASE
não é. O CASO
expressão não pode ser usada para controlar o fluxo de execução de instruções T-SQL, blocos de instruções, funções definidas pelo usuário e procedimentos armazenados. As 2 formas de expressão CASE
Existem duas formas de
CASE
expressão no SQL Server:- Simples
CASE
expressão - Pesquisou
CASE
expressão
Estes são explicados com exemplos abaixo.
Formulário 1 – A expressão CASE simples
O simples
CASE
expressão compara uma expressão a um conjunto de expressões simples para determinar o resultado. Aqui está um exemplo básico para demonstrar como um
CASE
expressão funciona no SQL Server. DECLARE @stock_ticker varchar(4) ='V';SELECT Company =CASE @stock_ticker QUANDO 'AAPL' THEN 'Apple' QUANDO 'FB' THEN 'Facebook' QUANDO 'V' THEN 'Visa' ELSE ' Não está no portfólio' END
Resultado:
+-----------+| Empresa ||-----------|| Visto |+-----------+
Neste exemplo, meu
CASE
expressão é parte de um SELECT
demonstração. Ele verifica três condições e tem um ELSE
para atender a qualquer coisa que não esteja coberta nas três condições. Neste caso, o código de ações
V
corresponde ao terceiro WHEN
expressão e a expressão fornecida por THEN
é devolvido. Para ser claro, o
CASE
real expressão é esta parte: CASE @stock_ticker QUANDO 'AAPL' DEPOIS 'Apple' QUANDO 'FB' DEPOIS 'Facebook' QUANDO 'MA' DEPOIS 'Mastercard' QUANDO 'V' DEPOIS 'Visa' ENTÃO 'Não está no portfólio' END
O que
CASE
faz é, ele verifica o valor de cada WHEN
expressão contra a expressão de entrada. No meu exemplo, o @stock_ticker
variável é a expressão de entrada. Portanto, está verificando o valor de cada WHEN
expressão contra o @stock_ticker
variável. Quando/se encontrar uma correspondência, retornará a expressão fornecida por
THEN
. Meu exemplo usa três
WHEN
expressões, mas poderia ter sido mais e poderia ter sido menos, dependendo das minhas necessidades. Formulário 2 – A expressão CASE pesquisada
O
CASE
pesquisado expression avalia um conjunto de expressões booleanas para determinar o resultado. Aqui está um exemplo de um
CASE
pesquisado expressão. DECLARE @price int =1500;SELECT Acessibilidade =CASE WHEN @price <100 THEN 'Cheap' WHEN @price>=100 AND @price <500 THEN 'Affordable' ELSE 'Caro' END
Resultado:
+-----------------+| Acessibilidade ||-----------------|| Caro |+-----------------+
Um
CASE
pesquisado expressão não tem uma expressão de entrada como o simples CASE
expressão. Você se lembrará disso em nosso simples
CASE
expressão, começou com CASE
@stock_ticker
, e, portanto, sabíamos que o WHEN
expressões foram todas avaliadas em relação ao valor de @stock_ticker
. Com o
CASE
pesquisado expressão, não fornecemos uma expressão de entrada no início assim. Em vez disso, cada QUANDO
expressão inclui uma expressão booleana para a qual será avaliada. Um exemplo de banco de dados
Aqui está um exemplo que demonstra como o
CASE
expressão pode ser usada em uma consulta de banco de dados. USE WideWorldImporters;SELECT CityName AS [City], LatestRecordedPopulation AS [Population], Size =CASE WHEN LatestRecordedPopulation <2000000 THEN 'Small City' WHEN LatestRecordedPopulation>=2000000 AND LatestRecordedPopulation <3000000 THEN 'Big City' ELSE ' Really Big City' END FROM Application.CitiesWHERE LatestRecordedPopulation> 1000000;
Resultado:
+--------------+--------------+---------------- -+| Cidade | População | Tamanho ||--------------+--------------+----------------- || Brooklin | 2565635 | Cidade Grande || Chicago | 2695598 | Cidade Grande || Dallas | 1197816 | Cidade Pequena || Houston | 2099451 | Cidade Grande || Los Angeles | 3792621 | Cidade realmente grande || Manhattan | 1619090 | Cidade Pequena || Nova York | 8175133 | Cidade realmente grande || Filadélfia | 1526006 | Cidade Pequena || Fênix | 1445632 | Cidade Pequena || Rainhas | 2272771 | Cidade Grande || Santo Antonio | 1327407 | Cidade Pequena || São Diego | 1307402 | Cidade Pequena || O Bronx | 1408473 | Cidade Pequena |+--------------+--------------+---------------- -+
Este exemplo usa um
CASE
pesquisado expressão para avaliar os resultados da LatestRecordedPopulation
coluna do Application.Cities
tabela. Tipos de dados
No SQL Server, o tipo de dados da expressão de entrada e o
WHEN
expressões devem ser iguais ou devem ser uma conversão implícita. Veja o que acontece se não forem:
DECLARE @stock_ticker varchar(4) ='V';SELECT Company =CASE @stock_ticker QUANDO 1 ENTÃO 'Apple' QUANDO 2 ENTÃO 'Facebook' QUANDO 3 ENTÃO 'Mastercard' QUANDO 4 ENTÃO 'Visa' ELSE ' Não está no portfólio' END
Resultado:
Msg 245, Level 16, State 1, Line 3Falha na conversão ao converter o valor varchar 'V' para o tipo de dados int.
Ordem de Avaliação
O T-SQL
CASE
expressão avalia suas condições sequencialmente e para na primeira condição cuja condição é satisfeita. Para demonstrar isso, vamos usar vários
WHEN
expressões que compartilham o mesmo valor:DECLARE @stock_ticker varchar(4) ='V';SELECT Company =CASE @stock_ticker QUANDO 'V' THEN 'Visa 1' QUANDO 'V' THEN 'Visa 2' QUANDO 'V' THEN 'Visa 3' ' ELSE 'Não está no portfólio' END
Resultado:
+-----------+| Empresa ||-----------|| Visto 1 |+-----------+
Neste caso, ele parou no primeiro
WHEN
expressão. Pode haver o cenário ocasional em que uma expressão é avaliada antes de um
CASE
expressão recebe os resultados da expressão como sua entrada. Em tais cenários, você pode acabar com um erro. Isso pode acontecer se você incluir uma expressão agregada como WHEN
expressão. Por esse motivo, a Microsoft aconselha que:
Você deve depender apenas da ordem de avaliação das condições WHEN para expressões escalares (incluindo subconsultas não correlacionadas que retornam escalares), não para expressões agregadas.
ELSE é opcional
O
ELSE
argumento é opcional. Portanto, poderíamos reescrever nosso exemplo de “acessibilidade” da seguinte forma:DECLARE @price int =1500;SELECT Acessibilidade =CASE WHEN @price <100 THEN 'Cheap' WHEN @price>=100 AND @price <500 THEN 'Affordable' WHEN @price>=500 THEN 'Caro ' FIM
Resultado:
+-----------------+| Acessibilidade ||-----------------|| Caro |+-----------------+
Embora, esteja ciente de que você pode acabar com
NULL
se você omitir o ELSE
argumento. O exemplo a seguir resulta em
NULL
:DECLARE @price int =1500;SELECT Acessibilidade =CASE WHEN @price <100 THEN 'Cheap' WHEN @price>=100 AND @price <500 THEN 'Affordable' WHEN @price>=500 AND @price <1000 THEN 'Caro' END
Resultado:
+-----------------+| Acessibilidade ||-----------------|| NULO |+-----------------+
Nesses casos, sempre podemos adicionar um
ELSE
argumento, apenas no caso (desculpe o trocadilho!):DECLARE @price int =1500;SELECT Acessibilidade =CASE WHEN @price <100 THEN 'Cheap' WHEN @price>=100 AND @price <500 THEN 'Affordable' WHEN @price>=500 AND @price <1000 THEN 'Caro' ELSE 'Desconhecido' END
Resultado:
+-----------------+| Acessibilidade ||-----------------|| Desconhecido |+-----------------+
É certo que este exemplo é provavelmente um pouco artificial. Afinal, não há necessidade de limitar o “caro”. Se algo é caro por menos de US $ 1.000, também é caro se for superior a US $ 1.000.
Mas o ponto é que você pode usar
ELSE
para capturar qualquer coisa que não seja coberta pelo WHEN
expressões. Expressões CASE aninhadas
Você pode aninhar
CASE
expressões, se necessário. DECLARE @price int, @on_sale bit;SET @price =1500;SET @on_sale =1;SELECT Acessibilidade =CASE WHEN @price <100 THEN 'Cheap' WHEN @price>=100 THEN CASE @on_sale WHEN 0 THEN 'Caro (mas não está à venda no momento)' WHEN 1 THEN 'Caro (e já está à venda!)' END END
Resultado:
+---------------------------------------+| Acessibilidade ||--------------------------------------------------|| Caro (e já está em promoção!) |+------------------------------------------------- +
No entanto, é importante observar que apenas 10 níveis de aninhamento são permitidos para
CASE
expressões no SQL Server. Se você tentar aninhar mais de 10 níveis, receberá um erro. CASO em uma cláusula ORDER BY
Como mencionado, o T-SQL
CASE
expressão pode ser usada em qualquer instrução ou cláusula que permita uma expressão válida. Portanto, você pode usá-lo em instruções como SELECT
, ATUALIZAR
, EXCLUIR
e SET
, e em cláusulas como IN
, ONDE
, ORDER POR
, GRUPAR POR
, e TENDO
. Usando um
CASE
expressão no ORDER BY
de uma instrução A cláusula pode ser útil quando você deseja fazer uma exceção especial para determinados valores ao ordenar seus resultados. Suponha que executemos a seguinte consulta em uma tabela contendo gêneros musicais.
SELECT Genre FROM MusicGenresORDER BY Gênero ASC;
Resultado:
+---------+| Gênero ||---------|| Azuis || País || Hip Hop || Jazz || Metais || Outros || Pop || Rap || Rocha |+---------+
Aqui, ordenamos os resultados pelo
Genre
coluna, em ordem crescente. Isso é bom, exceto por uma coisa. O gênero chamado Outro . Não seria bom se pudéssemos mover Outro ao fundo?
Podemos conseguir isso com o
CASE
expressão pegando a consulta acima e modificando-a da seguinte maneira. SELECT GenreFROM MusicGenresORDER BY CASE Gênero WHEN 'Other' THEN 1 ELSE 0 END ASC, Gênero ASC;
Resultado:
+---------+| Gênero ||---------|| Azuis || País || Hip Hop || Jazz || Metais || Pop || Rap || Rocha || Outros |+---------+
CASE em uma declaração UPDATE
Aqui está um exemplo de como usar um
CASE
expressão em um UPDATE
demonstração. Suponha que temos a seguinte tabela:
+---------+-----------+-----------+----------+| DogId | DogName | GoodDog | Jantar ||---------+-----------+-----------+----------|| 1 | Buscar | 1 | NULO || 2 | Fofo | 0 | NULO || 3 | Wag | 0 | NULO || 1001 | Brian | 1 | NULO || 1002 | Rambo | 0 | NULO || 1003 | BamBam | 1 | NULL |+---------+-----------+-----------+----------+
Recentemente adicionamos oJantar
coluna, e ainda éNULL
, aguardando a inserção de valores.
Mas os valores a serem inseridos dependerão do valor doGoodDog
coluna.
Poderíamos usar umCASE
expressão em tal cenário.
UPDATE Dogs SET Dinner =CASE GoodDog WHEN 1 THEN 'Sunday Roast' ELSE 'Airline food' ENDSELECT * FROM Dogs;
Resultado:
+---------+-----------+-----------+------------ --+| DogId | DogName | GoodDog | Jantar ||---------+-----------+-----------+------------- -|| 1 | Buscar | 1 | Assado de Domingo || 2 | Fofo | 0 | Comida de avião || 3 | Wag | 0 | Comida de avião || 1001 | Brian | 1 | Assado de Domingo || 1002 | Rambo | 0 | Comida de avião || 1003 | BamBam | 1 | Assado de Domingo |+---------+-----------+-----------+------------ --+CASE em uma instrução INSERT
Podemos pegar a tabela do exemplo acima e inserir um novo valor.
E podemos aproveitar novamente oCASE
expressão para inserir o valor apropriado noJantar
coluna.
DECLARE @DogName nvarchar(60), @GoodDog bit;SET @DogName ='Preguiçoso';SET @GoodDog =0;INSERT INTO Dogs ( DogName, GoodDog, Dinner )VALUES ( @DogName, @GoodDog, CASE @GoodDog WHEN 1 THEN 'Sunday Roast' ELSE 'Airline food' END );SELECT * FROM Dogs;
Resultado:
+---------+-----------+-----------+------------ --+| DogId | DogName | GoodDog | Jantar ||---------+-----------+-----------+------------- -|| 1 | Buscar | 1 | Assado de Domingo || 2 | Fofo | 0 | Comida de avião || 3 | Wag | 0 | Comida de avião || 1001 | Brian | 1 | Assado de Domingo || 1002 | Rambo | 0 | Comida de avião || 1003 | BamBam | 1 | Assado de Domingo || 1004 | Preguiçoso | 0 | Comida de avião |+---------+-----------+-----------+------------ --+
Desta vez, oCASE
expressão estava avaliando o valor de uma variável que acabamos de definir e inserindo o valor apropriado noDinner
coluna.
É uma declaração CASE ou uma expressão CASE?
No SQL, muitas coisas são chamadas de “declarações” quando, na verdade, são outra coisa. Isso também parece ser verdade para o T-SQL “CASE
demonstração".
Embora seja frequentemente chamado deCASE
declaração, é mais correto chamá-la deCASE
expressão . É também assim que a documentação da Microsoft se refere a ele.
No SQL Server, em vez de ser uma instrução em si,CASE
pode ser usado em qualquer instrução ou cláusula que permita uma expressão válida. Uma expressão é uma combinação de símbolos e operadores que são avaliados para obter um único valor de dados.
No entanto, alguns SGBDs distinguem entre oCASE
instrução e oCASE
expressão e têm uma sintaxe ligeiramente diferente para cada um. MySQL distingue entre oCASE
instrução e oCASE
operador, que é essencialmente o mesmo que oCASE
expressão.