Caso nell'istruzione Select


141

Ho un'istruzione SQL che ha un CASEda SELECTe non riesco proprio a farlo bene. Ragazzi, potete mostrarmi un esempio di CASEdove i casi sono le condizioni e i risultati provengono dai casi. Per esempio:

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

dove mostrano i risultati

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

La mia risposta spiega due tipi di casi 1. Espressione CASE semplice 2. Espressioni CASE ricercate. Ed entrambi i casi vengono utilizzati in SELECT, UPDATE, con ORDER BY, con HAVING query.
Somnath Muluk,

Risposte:


195

MSDN è un buon riferimento per questo tipo di domande relative alla sintassi e all'utilizzo. Questo è dalla pagina 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

Un altro buon sito che potresti voler controllare se stai usando SQL Server è SQL Server Central . Questo ha una grande varietà di risorse disponibili per qualsiasi area di SQL Server che desideri imparare.


82

Penso che questi potrebbero essere utili per te.

Utilizzo di SELECTun'istruzione con CASEun'espressione semplice

All'interno di SELECTun'istruzione, CASEun'espressione semplice consente solo un controllo dell'uguaglianza; non vengono effettuati altri confronti. L'esempio seguente utilizza l' CASEespressione per modificare la visualizzazione delle categorie della linea di prodotti per renderle più comprensibili.

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

Utilizzo di SELECTun'istruzione con CASEun'espressione cercata

All'interno di SELECTun'istruzione, l' CASEespressione cercata consente di sostituire i valori nel set di risultati in base ai valori di confronto. L'esempio seguente mostra il prezzo di listino come commento testuale basato sulla fascia di prezzo di un prodotto.

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 CASEin una ORDER BYclausola

Gli esempi seguenti utilizzano l' CASEespressione in una ORDER BYclausola per determinare l'ordinamento delle righe in base a un determinato valore di colonna. Nel primo esempio, viene valutato il valore nella colonna SalariedFlag della tabella HumanResources.Employee. I dipendenti che hanno impostato SalariedFlag su 1 vengono restituiti in ordine decrescente da BusinessEntityID. I dipendenti che hanno SalariedFlag impostato su 0 vengono restituiti in ordine crescente da BusinessEntityID. Nel secondo esempio, il set di risultati è ordinato dalla colonna TerritoryName quando la colonna CountryRegionName è uguale a "Stati Uniti" e da CountryRegionName per tutte le altre righe.

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 CASEin una UPDATEdichiarazione

L'esempio seguente utilizza l' CASEespressione in UPDATEun'istruzione per determinare il valore impostato per la colonna VacationHours per i dipendenti con SalariedFlag impostato su 0. Quando si sottrae 10 ore da VacationHours si ottiene un valore negativo, VacationHours viene aumentato di 40 ore; in caso contrario, VacationHours viene aumentato di 20 ore. La OUTPUTclausola viene utilizzata per visualizzare i valori di ferie prima e dopo le vacanze.

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 CASEin una HAVINGclausola

L'esempio seguente utilizza l' CASEespressione in una HAVINGclausola per limitare le righe restituite SELECTdall'istruzione. L'istruzione restituisce la tariffa oraria massima per ciascun titolo di lavoro nella tabella HumanResources.Employee. La HAVINGclausola limita i titoli a quelli detenuti da uomini con un tasso di paga massimo superiore a 40 dollari o donne con un tasso di paga massimo superiore a 42 dollari.

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;

Per maggiori dettagli descrizione di questi esempi visita la fonte .

Visita anche qui e qui per alcuni esempi con grandi dettagli.


Apprezzo molto una risposta così dettagliata.
Aneeq Azam Khan,

12

puoi anche usare:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.