Caso na instrução Select


141

Eu tenho uma instrução SQL que tem um CASEfrom SELECTe eu simplesmente não consigo acertar. Vocês podem me mostrar um exemplo de CASEonde os casos são as condições e os resultados deles? Por exemplo:

     Select xxx, yyy
     case : desc case when bbb then 'blackberry';
     when sss then 'samsung';
     end 
     from (select ???? .....

onde os resultados mostram

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

Minha resposta explicando dois tipos de caso 1. Expressão CASE simples 2. Expressões CASE pesquisadas. E o uso de maiúsculas e minúsculas nos tipos SELECT, UPDATE, With ORDER BY, With HAVING query.
Somnath Muluk

Respostas:


195

O MSDN é uma boa referência para esse tipo de perguntas sobre sintaxe e uso. Isto é da página Transact SQL Reference - CASE.

http://msdn.microsoft.com/en-us/library/ms181765.aspx

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Name, "Price Range" = 
  CASE 
     WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
     WHEN ListPrice < 50 THEN 'Under $50'
     WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
     WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
     ELSE 'Over $1000'
  END
FROM Production.Product
ORDER BY ProductNumber ;
GO

Outro site bom que você pode conferir se estiver usando o SQL Server é o SQL Server Central . Isso tem uma grande variedade de recursos disponíveis para qualquer área do SQL Server que você gostaria de aprender.


82

Eu acho que isso pode ser útil para você.

Usando uma SELECTdeclaração com um simplesCASE expressão

Dentro de uma SELECTdeclaração, uma CASEexpressão simples permite apenas uma verificação de igualdade; nenhuma outra comparação é feita. O exemplo a seguir usa a CASEexpressão para alterar a exibição das categorias de linha de produtos para torná-las mais compreensíveis.

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Category =
      CASE ProductLine
         WHEN 'R' THEN 'Road'
         WHEN 'M' THEN 'Mountain'
         WHEN 'T' THEN 'Touring'
         WHEN 'S' THEN 'Other sale items'
         ELSE 'Not for sale'
      END,
   Name
FROM Production.Product
ORDER BY ProductNumber;
GO

Usando uma SELECTinstrução com uma CASEexpressão pesquisada

Dentro de uma SELECTinstrução, a CASEexpressão pesquisada permite que os valores sejam substituídos no conjunto de resultados com base nos valores de comparação. O exemplo a seguir exibe o preço de tabela como um comentário de texto com base na faixa de preço de um produto.

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Name, "Price Range" = 
      CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END
FROM Production.Product
ORDER BY ProductNumber ;
GO

Usando CASEem uma ORDER BYcláusula

Os exemplos a seguir usam a CASEexpressão em uma ORDER BYcláusula para determinar a ordem de classificação das linhas com base em um determinado valor da coluna. No primeiro exemplo, o valor na coluna SalariedFlag da tabela HumanResources.Employee é avaliado. Os funcionários com SalariedFlag definido como 1 são retornados pelo BusinessEntityID em ordem decrescente. Os funcionários com SalariedFlag definido como 0 são retornados pelo BusinessEntityID em ordem crescente. No segundo exemplo, o conjunto de resultados é ordenado pela coluna TerritoryName quando a coluna CountryRegionName é igual a 'United States' e por CountryRegionName para todas as outras linhas.

SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO


SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName
         ELSE CountryRegionName END;

Usando CASEem uma UPDATEdeclaração

O exemplo a seguir usa a CASEexpressão em uma UPDATEinstrução para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0. Ao subtrair 10 horas de VacationHours resulta em um valor negativo, VacationHours é aumentado em 40 horas; caso contrário, o VacationHours é aumentado em 20 horas. A OUTPUTcláusula é usada para exibir os valores de férias antes e depois.

USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET VacationHours = 
    ( CASE
         WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
         ELSE (VacationHours + 20.00)
       END
    )
OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue, 
       Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0; 

Usando CASEem uma HAVINGcláusula

O exemplo a seguir usa a CASEexpressão em uma HAVINGcláusula para restringir as linhas retornadas pela SELECTinstrução A instrução retorna a taxa horária máxima para cada cargo na tabela HumanResources.Employee. A HAVINGcláusula restringe os títulos àqueles mantidos por homens com uma taxa de remuneração máxima superior a 40 dólares ou por mulheres com uma taxa de remuneração máxima superior a 42 dólares.

USE AdventureWorks2012;
GO
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate
FROM HumanResources.Employee AS e
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (MAX(CASE WHEN Gender = 'M' 
        THEN ph1.Rate 
        ELSE NULL END) > 40.00
     OR MAX(CASE WHEN Gender  = 'F' 
        THEN ph1.Rate  
        ELSE NULL END) > 42.00)
ORDER BY MaximumRate DESC;

Para uma descrição mais detalhada desses exemplos, visite a fonte .

Visite também aqui e aqui para alguns exemplos com ótimos detalhes.


Realmente aprecio uma resposta tão detalhada.
Aneeq Azam Khan

12

você também pode usar:

SELECT CASE
         WHEN upper(t.name) like 'P%' THEN
          'productive'
         WHEN upper(t.name) like 'T%' THEN
          'test'
         WHEN upper(t.name) like 'D%' THEN
          'development'
         ELSE
          'unknown'
       END as type
FROM table t
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.