Desvendando o SQL - Parte VI - Estruturas Condicionais e de Repetição
Autor: Rubens Lima | Publicado: 2013-08-01T00:39:00-03:00





Estamos de volta para hoje falar de mais um assunto sobre a linguagem SQL. Em nosso último artigo mostramos como funcionam as VIEWS, acompanhe esse artigo em Desvendando o SQL - Parte V - Visões, e também os outros artigos de nossa série, os links estão sempre no final de nossos artigos. Hoje vamos falar um pouco sobre as instruções condicionais e instruções de repetição. Boa leitura e estudos



 

Em determinadas situações nos deparamos com consultas que para obtermos um resultado dependemos de outro ou precisamos que determinada instrução se repita algumas vezes, é exatamente nessas situações que utilizamos as instruções condicionais (CASE, IF) e as instruções de repetição (WHILE).




INSTRUÇÕES CONDICIONAIS (IF)




Com uma sintaxe simples esta expressão impõe uma condição para execução de uma instrução SQL. Se a condição retorna TRUE (Verdadeiro) a instrução é executada. Caso se deseje a execução de uma instrução quando a condição não for satisfeita, retornando FALSE (Falso), incluímos a palavra chave ELSE, e o que nessa clausula será executado.




Sintaxe




IF &lt;Condição&gt;

&nbsp;&nbsp;&nbsp; Bloco de instruções

[ELSE

&nbsp;&nbsp;&nbsp; Bloco de instruções] 




A construção apresentada IF...ELSE pode ser usada em procedimentos armazenados (veremos em breve) e em consultas ad hoc. Inclusive podemos aninhar os blocos de IF...ELSE, colocando um dentro do outro.




Exemplos




A. Expressões Simples






--O exemplo a seguir tem uma expressão booliana simples (1=1) que é verdadeira e, portanto, imprime a primeira instrução.

IF 1 = 1 PRINT 'Expressão é verdadeira'

ELSE PRINT 'Expressão é falsa' ;

--O exemplo a seguir tem uma expressão booliana simples (1=2) que é falsa e, portanto, imprime a segunda instrução.

IF 1 = 2 PRINT 'Expressão é verdadeira'

ELSE PRINT 'Expressão é falsa' ;

GO




B. Usando uma consulta como parte de uma expressão booliana. O exemplo a seguir executa uma consulta como parte da expressão booliana. Vamos descobrir se existem mais de 5 produtos com a categoria de bebidas.







USE DBEstoque;

GO

IF (SELECT COUNT(*) 

FROM 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBProduto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p inner join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBSubcategoria&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s ON s.CD_SUB = p.CD_SUB

WHERE s.CD_CATEGORIA = 1) &gt; 5




PRINT 'Existem mais de 5 produtos com a categoria Bebidas'

ELSE 

PRINT 'Existem 5 ou menos produtos com a categoria Bebidas' ;

GO




C. Usando um bloco de instrução.

O exemplo a seguir executa uma consulta como parte da expressão booliana e depois executa blocos de instrução ligeiramente diferentes com base no resultado da expressão booliana. Cada bloco de instrução começa com BEGIN e termina com END. Caso a instrução seja somente de uma linha não há necessidade do bloco BEGIN...END.&nbsp;




GO

DECLARE 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @AvgCount decimal(8,2), 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ProdCount int,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Count int




set @Count = (SELECT COUNT(*) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBProduto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p inner join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBSubcategoria&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s ON s.CD_SUB = p.CD_SUB

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE s.CD_CATEGORIA = 1)

IF @Count &gt; 5

BEGIN

&nbsp;&nbsp; SET @ProdCount = 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT COUNT(*) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBProduto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p inner join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBSubcategoria&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s ON s.CD_SUB = p.CD_SUB

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE s.CD_CATEGORIA = 1);

&nbsp;&nbsp; SET @AvgCount = AVG(@ProdCount);




&nbsp;&nbsp; PRINT 'Existem ' + CAST(@ProdCount AS varchar(3)) + ' com a categoria Bebidas'

&nbsp;&nbsp; PRINT 'A média de produtos com contagem maior que 5 é: ' + CAST(@AvgCount AS varchar(8)) + '.';

END

ELSE 

BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @ProdCount = 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT COUNT(*) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBProduto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p inner join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBSubcategoria&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s ON s.CD_SUB = p.CD_SUB

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE s.CD_CATEGORIA = 1);

&nbsp;&nbsp; SET @AvgCount = AVG(@ProdCount);

&nbsp;&nbsp; PRINT 'A média de produtos com contagem menor ou igual a 5 é: ' + CAST(@AvgCount AS varchar(8)) + '.' ;

END ;

GO




D.Usando instruções IF...ELSE aninhadas




DECLARE @Numero int;

SET @Numero = 50;

IF @Numero &gt; 100

&nbsp;&nbsp; PRINT 'O número é grande';

ELSE 

&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @Numero &lt; 10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRINT 'O número é pequeno.';

&nbsp;&nbsp; ELSE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRINT 'O número é mediano.';

&nbsp;&nbsp; END ;

GO




INSTRUÇÕES CONDICIONAIS (CASE)




Essa expressão avalia uma lista de condições e retorna uma dos vários resultados possíveis. A expressão CASE tem dois formatos possíveis e ambos dão suporte ao argumento ELSE (opcional):



A expressão simples que compara uma expressão com um conjunto de expressões;
A expressão que avalia um conjunto de expressões;
A expressão case pode ser usada em qualquer instrução que permita uma expressão válida, como SELECT, UPDATE, DELETE e SET e em cláusulas como SELECT LIST, IN, WHERE, ORDER BY e HAVING. Como o IF o CASE também permite aninhamentos até o 10º nível


 

Sintaxe




Expressão CASE simples 

CASE &lt;expressão de entrada&gt; 

&nbsp;&nbsp;&nbsp;&nbsp; WHEN Condição1 THEN Resultado&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp; WHEN Condição2 THEN Resultado [ ...n ]

[ELSE Resultado] 

END







Expressão CASE pesquisada

CASE

&nbsp;&nbsp;&nbsp;&nbsp; WHEN &lt;expressão de entrada1&gt; THEN Resultado&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp; WHEN &lt;expressão de entrada2&gt; THEN Resultado&nbsp; [ ...n ] 

[ELSE Resultado] 

END




Expressão CASE Simples




Essa expressão compara a expressão de entrada com cada condição apresentada por equivalência, caso seja equivalente o resultado correspondente será apresentado.




Expressão CASE pesquisada




Essa expressão avalia em separado cada expressão da clausula WHEN e verifica se a mesma é verdadeira e retorna o resultado da clausula THEN correspondente. 

Ambas as expressões, simples e pesquisada,&nbsp; atendem algumas condições:

<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Somente uma verificação de igualdade é permitida (somente na expressão simples);

<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->A ordem de avaliação é respeitada como apresentada;

<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Retorna o resultado correspondente como TRUE;

<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Se nenhuma das condições atenderem a expressão de entrada retorna o resultado do ELSE, caso tenha sido especificado, caso contrário, retorna NULL.




Exemplos




Usando uma instrução SELECT com uma expressão CASE simples. Dentro de uma instrução SELECT, uma expressão CASE simples é permitida somente para uma verificação de igualdade; nenhuma outra comparação é feita. O exemplo a seguir usa a expressão CASE para alterar a exibição dos status dos produtos para torná-las mais compreensíveis.






GO

SELECT&nbsp;&nbsp; CD_REFERENCIA, DESC_PRODUTO, 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE ST_PRODUTO

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'A' THEN 'Ativo'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'I' THEN 'Inativo'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END AS ST_PRODUTO

FROM TBProduto

ORDER BY CD_REFERENCIA

GO




CD_REFERENCIA DESC_PRODUTO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ST_PRODUTO

------------- -------------------------------------------------- ----------

1001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whisky 08 Anos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ativo

1002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whisky 12 Anos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

1003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vinho&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Arroz Branco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

2002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Feijão Carioca&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

3001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Leite Longa Vida&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

3002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Leite Longa Vida Desnatado&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

4010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macarrão Parafuso&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

4020&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macarrão Talharim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

6100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pêssego em Calda&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

6200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ervilha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ativo

6300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Milho Verde&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ativo




(12 linha(s) afetadas)







Usando uma instrução SELECT com uma expressão CASE pesquisada. Dentro de uma instrução SELECT, a expressão CASE pesquisada é permitida para valores a serem substituídos no conjunto de resultados com base nos valores de comparação. O exemplo exibe o preço da lista como um comentário de texto com base na faixa de preços de um produto.



GO

SELECT&nbsp;&nbsp; DESC_PRODUTO, QTD_ESTOQUE,&nbsp;

CASE 

&nbsp; &nbsp;WHEN VLR_UNITARIO &lt; 5 THEN 'Menor que R$ 5,00'

&nbsp; &nbsp;WHEN VLR_UNITARIO &gt;= 5 and VLR_UNITARIO &lt; 25 THEN 'Menor que R$ 25,00'

&nbsp; &nbsp;WHEN VLR_UNITARIO &gt;= 25 and VLR_UNITARIO &lt; 100 THEN 'Menor que R$ 100,00'

&nbsp; &nbsp;ELSE 'Maior que R$ 100,00'

END as Preco

FROM

&nbsp;&nbsp; TBEstoque e inner join

&nbsp;&nbsp; TBProduto p on p.cd_produto = e.cd_produto

ORDER BY DESC_PRODUTO ;

GO




Usando CASE em uma cláusula ORDER BY. O exemplo usa a expressão para determinar a ordem de classificação das linhas com base no valor da coluna fornecido.




SELECT CD_REFERENCIA, DESC_PRODUTO

FROM TBProduto

ORDER BY 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE ST_PRODUTO WHEN 'A' THEN ST_PRODUTO END,

&nbsp;&nbsp;&nbsp; CASE ST_PRODUTO WHEN 'I' THEN ST_PRODUTO END DESC;

GO




SELECT DESC_PRODUTO, QTD_ESTOQUE, SGL_UNIDADE, VLR_UNITARIO

FROM 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBEstoque e inner join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBProduto p on p.cd_produto = e.cd_produto inner join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBUnidade u on u.CD_UNIDADE = e.CD_UNIDADE




ORDER BY CASE&nbsp; WHEN DTH_MOVIMENTO &lt; getdate() THEN VLR_UNITARIO

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE DESC_PRODUTO END;




Usando CASE em uma instrução UPDATE. O exemplo usa a expressão para determinar o valor definido para a coluna VLR_UNITARIO dos produtos, aplicando um acréscimo de 10, 15 ou 20% de acordo com o valor e caso contrário, somente 5%. A cláusula OUTPUT é usada para exibir os valores de antes e depois da alteração.






GO

UPDATE TBEstoque

SET VLR_UNITARIO = 

&nbsp;&nbsp;&nbsp; ( CASE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN VLR_UNITARIO &lt; 10.00 THEN VLR_UNITARIO * 1.10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN VLR_UNITARIO &gt;= 10.00 and VLR_UNITARIO &lt; 50.00 THEN VLR_UNITARIO * 1.15

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN VLR_UNITARIO &gt;= 50.00 THEN VLR_UNITARIO * 1.20

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE VLR_UNITARIO * 1.05

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp; )

OUTPUT Deleted.CD_ESTOQUE, Deleted.VLR_UNITARIO AS ValorAnterior, 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inserted.VLR_UNITARIO AS ValorAtual





INSTRUÇÕES DE REPETIÇÃO



 Vamos falar nesse artigo do laço de repetição WHILE, existe também o CURSOR, mas para esse vamos futuramente dedicar um artigo exclusivo.

A instrução WHILE define uma condição para executar repetidamente uma ou várias instruções em bloco. Enquanto a condição especificada for verdadeira a repetição acontece. Internamente podemos controlar o WHILE com o BREAK, parando a execução, e o CONTINUE, continuando a execução.



Sintaxe


 WHILE Condição 

&nbsp;&nbsp;&nbsp;&nbsp; { bloco de instruções | BREAK | CONTINUE } 
&nbsp;
&nbsp;

No aninhamentos de instruções WHILE o BREAK encerrará sempre o bloco WHILE mais interno prosseguindo para o próximo mais externo e assim sucessivamente.




Exemplos


Instrução WHILE simples.




DECLARE @VAR INT 

SET @VAR = 0




WHILE @VAR &lt; 10

BEGIN

&nbsp;&nbsp; PRINT 'O NÚMERO É: ' + CAST(@VAR AS VARCHAR(3))

&nbsp;&nbsp; SET @VAR = @VAR + 1

END

PRINT 'O NÚMERO FINAL É: ' + CAST(@VAR AS VARCHAR(3))





Usando BREAK E CONTINUE. No exemplo abaixo, enquanto&nbsp; valor unitário médio for menor que R$ 50,00 a instrução vai atualizar o peso para o dobro e depois selecionar o mais alto, se for maior que R$ 2000,00 então para o loop, se não continuará dobrando o preço até satisfazer a condição e em seguida exibe uma mensagem.




GO

WHILE (SELECT AVG(VLR_UNITARIO) FROM TBEstoque) &lt; 50

BEGIN

&nbsp;&nbsp; UPDATE TBEstoque

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET VLR_UNITARIO = VLR_UNITARIO * 2

&nbsp;&nbsp; SELECT MAX(VLR_UNITARIO) FROM TBEstoque

&nbsp;&nbsp; IF (SELECT MAX(VLR_UNITARIO) FROM TBEstoque) &gt; 2000

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BREAK

&nbsp;&nbsp; ELSE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONTINUE

END

PRINT 'Muito alto para o mercado';







Por hoje ficamos por aqui, espero que tenham gostado, caso tenha ficado dúvidas sintam-se a vontade para perguntar, comentar, sugerir. No próximo artigo estaremos de volta com um assunto que é muito utilizado nas instruções SQL, a conversão de valores, então vamos mostrar como utilizar o CAST e o CONVERT. Não percam.



Grande abraço e até lá.





Artigos anteriores:

Desvendando o SQL - Parte I - Introdução
Desvendando o SQL - Parte II - Criando um Banco de Dados e Tabelas

Desvendando o SQL - Parte III - Alterando Registros


Desvendando o SQL - Parte IV - Consultas
Desvendando o SQL - Parte V - Visões