2013-01-07 14 views
99

Mam instrukcję SQL, która ma CASE z SELECT i po prostu nie mogę tego naprawić. Czy możecie pokazać mi przykład CASE, gdzie przypadki są warunkami, a wyniki pochodzą z przypadków. Na przykład:Obudowa w Select Statement

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

gdzie wyniki pokazują

name       age  handphone 
xxx1       yyy1  blackberry 
xxx2       yyy2  blackberry 
+0

[Moja odpowiedź] (http://stackoverflow.com/a/38874485/1045444) wyjaśniające dwa typy spraw 1. Proste wyrażenie CASE 2. Wyszukowane wyrażeń CASE. Oraz użycie obu typów w SELECT, UPDATE, ORDER BY, HAVING queries. –

Odpowiedz

148

MSDN jest dobrym odniesienia dla tego typu pytania dotyczące składni i zastosowania. Jest to na stronie 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 

Innym dobrym miejscu może chcesz sprawdzić, czy używasz SQL Server jest SQL Server Central. To ma wiele różnych dostępnych zasobów dla dowolnego obszaru SQL Server, którego chciałbyś się nauczyć.

6

można również użyć:

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

myślę, że to może być pomocne dla Ciebie.

Korzystanie z SELECT oświadczenie o prostym CASE ekspresji

ciągu SELECT oświadczeniu prosty CASE wyrażenie umożliwia tylko sprawdzenie równości; nie dokonuje się żadnych innych porównań. W poniższym przykładzie użyto wyrażenia CASE, aby zmienić wyświetlanie kategorii linii produktów, aby były bardziej zrozumiałe.

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 

Korzystanie z SELECT oświadczenie o poszukiwanej CASE ekspresji

ciągu SELECT oświadczeniu poszukiwanej CASE ekspresja pozwala na wartości, które należy wymienić w zestawie wyników na podstawie wartości porównawczych. Poniższy przykład wyświetla cenę z listy jako komentarz tekstowy w oparciu o przedział cenowy produktu.

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 

Stosując CASE w ORDER BY klauzuli

Następujące przykłady użyto wyrażenia CASE w klauzuli ORDER BY określić porządek rzędów na podstawie danej wartości kolumny. W pierwszym przykładzie obliczana jest wartość w kolumnie SalariedFlag tabeli HumanResources.Employee. Pracownicy, którzy mają ustawioną wartość SalariedFlag na 1, są zwracani w kolejności według BusinessEntityID w malejącej kolejności. Pracownicy, którzy mają ustawioną wartość SalariedFlag na 0, są zwracani w kolejności według BusinessEntityID w porządku rosnącym. W drugim przykładzie zestaw wyników jest uporządkowany według kolumny TerritoryName, gdy kolumna CountryRegionName jest równa "United States" i CountryRegionName dla wszystkich innych wierszy.

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; 

Korzystanie CASE w UPDATE rachunku

W poniższym przykładzie użyto wyrażenia w instrukcji UPDATECASE określić wartość ustawioną dla VacationHours kolumn dla pracowników z SalariedFlag ustawiony na 0. Kiedy odjęcie 10 godzin od VacationHours daje wartość ujemną, VacationHours zwiększa się o 40 godzin; w przeciwnym razie VacationHours zostanie zwiększona o 20 godzin. Klauzula OUTPUT służy do wyświetlania wartości przed i po urlopie.

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; 

Stosując CASE w HAVING klauzuli

W poniższym przykładzie użyto wyrażenia CASE w HAVING klauzuli ograniczyć wierszy zwróconych przez instrukcję SELECT. Instrukcja zwraca maksymalną stawkę godzinową dla każdego stanowiska w tabeli HumanResources.Employee. Klauzula HAVING ogranicza tytuły do ​​tych, które są w posiadaniu mężczyzn z maksymalną stawką wynagrodzenia większą niż 40 dolarów lub kobiet z maksymalną stawką wynagrodzenia większą niż 42 dolarów.

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; 

Aby uzyskać więcej informacji, opis tych przykładów znajduje się pod adresem source.

Odwiedź również kilka przykładów z przykładami ze szczegółowymi informacjami na temat here i here.