2013-01-07 6 views
99

Ich habe eine SQL-Anweisung, die eine CASE von SELECT hat und ich kann es einfach nicht richtig machen. Können Sie mir ein Beispiel von CASE zeigen, wo die Fälle die Bedingungen sind und die Ergebnisse von den Fällen sind. Zum Beispiel:Fall in Select-Anweisung

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

wo die Ergebnisse zeigen

name       age  handphone 
xxx1       yyy1  blackberry 
xxx2       yyy2  blackberry 
+0

[Meine Antwort] (http://stackoverflow.com/a/38874485/1045444) zwei Falltypen erklären 1. Einfacher CASE-Ausdruck 2. Gesuchte CASE-Ausdrücke. Und die Fallverwendung beider Typen in SELECT, UPDATE, mit ORDER BY, mit HAVING-Abfragen. –

Antwort

148

Die MSDN ist eine gute Referenz für diese Art von Fragen in Bezug auf Syntax und Verwendung. Dies ist von der Transact SQL Reference - CASE Seite.

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 

Eine weitere gute Website, die Sie, wenn Sie SQL Server ist SQL Server Central verwenden sind überprüfen möchten. Dies bietet eine große Auswahl an Ressourcen für den Bereich von SQL Server, den Sie gerne erlernen möchten.

6

Sie können auch verwenden:

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 
51

Ich denke, diese für Sie hilfreich sein könnten.

eine SELECT Aussage mit einem einfachen CASE Ausdruck Mit

Innerhalb einer SELECT Anweisung, ein einfacher CASE Ausdruck für nur eine Gleichheitsprüfung ermöglicht; keine anderen Vergleiche werden gemacht. Im folgenden Beispiel wird der Ausdruck CASE verwendet, um die Anzeige von Produktlinienkategorien zu ändern, um sie verständlicher zu machen.

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 

Mit einer SELECT Anweisung mit einem gesucht CASE Ausdruck

Innerhalb einer SELECT Aussage, der gesuchten CASE Ausdruck ermöglicht Werte in der Ergebnismenge auf Vergleichswert basierend ersetzt werden. Im folgenden Beispiel wird der Listenpreis als Textkommentar basierend auf der Preisspanne für ein Produkt angezeigt.

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 

Verwendung CASE in einer Klausel ORDER BY

Die folgenden Beispiele verwenden die CASE Expression in einer Klausel ORDER BY die Sortierreihenfolge der Zeilen auf einem gegebenen Spaltenwert zu bestimmen. Im ersten Beispiel wird der Wert in der Spalte SalariedFlag der Tabelle HumanResources.Employee ausgewertet. Mitarbeiter, bei denen das SalariedFlag auf 1 gesetzt ist, werden von der BusinessEntityID in absteigender Reihenfolge zurückgegeben. Mitarbeiter, deren SalariedFlag auf 0 gesetzt ist, werden von der BusinessEntityID in aufsteigender Reihenfolge zurückgegeben. Im zweiten Beispiel wird die Ergebnismenge nach der Spalte TerritoryName sortiert, wenn die Spalte CountryRegionName für alle anderen Zeilen gleich 'United States' und nach CountryRegionName ist.

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; 

Verwendung CASE in einer Anweisung UPDATE

Das folgende Beispiel verwendet die CASE Expression in einer UPDATE Anweisung den Wert zu bestimmen, die für die Spaltenvacation für Mitarbeiter eingestellt mit SalariedFlag auf 0 gesetzt, wenn Wenn Sie 10 Stunden von VacationHours subtrahieren, ergibt sich ein negativer Wert, VacationHours wird um 40 Stunden erhöht; Ansonsten wird VacationHours um 20 Stunden erhöht. Die Klausel OUTPUT wird verwendet, um die Werte für Vorher und Nachher Urlaub anzuzeigen.

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; 

Mit CASE in einer HAVING Klausel

Das folgende Beispiel verwendet die CASE Expression in einer HAVING-Klausel die Zeilen von der SELECT Anweisung zurück zu beschränken. Die Anweisung gibt den maximalen Stundensatz für jeden Jobtitel in der Tabelle HumanResources.Employee zurück. Die HAVING Klausel beschränkt die Titel auf diejenigen, die von Männern mit einer maximalen Bezahlung von mehr als 40 Dollar oder Frauen mit einer maximalen Bezahlung von mehr als 42 Dollar gehalten werden.

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; 

Weitere Informationen Beschreibung dieser Beispiele finden Sie auf der source.

Besuchen Sie auch here und here für einige Beispiele mit tollen Details.