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
CASEexpressão - Pesquisou
CASEexpressã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 oJantarcoluna, e ainda éNULL, aguardando a inserção de valores.
Mas os valores a serem inseridos dependerão do valor doGoodDogcoluna.
Poderíamos usar umCASEexpressã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 oCASEexpressão para inserir o valor apropriado noJantarcoluna.
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, oCASEexpressão estava avaliando o valor de uma variável que acabamos de definir e inserindo o valor apropriado noDinnercoluna.
É 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 “CASEdemonstração".
Embora seja frequentemente chamado deCASEdeclaração, é mais correto chamá-la deCASEexpressã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,CASEpode 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 oCASEinstrução e oCASEexpressão e têm uma sintaxe ligeiramente diferente para cada um. MySQL distingue entre oCASEinstrução e oCASEoperador, que é essencialmente o mesmo que oCASEexpressão.