Mam instrukcję SQL, która ma CASE
z SELECT
i po prostu nie mogę'dostać tego dobrze. Czy możecie mi pokazać przykład CASE
, gdzie przypadki są warunkami, a wyniki są z przypadków. Na przykład:
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
MSDN jest dobrym punktem odniesienia dla tego typu pytań dotyczących składni i użytkowania. To jest z Transact SQL Reference - CASE page.
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
Inną dobrą stroną, którą możesz chcieć sprawdzić, jeśli używasz SQL Server jest SQL Server Central. Zawiera ona wiele różnych zasobów dla każdego obszaru SQL Server, którego chciałbyś się nauczyć.
Myślę, że to może być pomocne dla Ciebie .
Użycie instrukcji SELECT
z prostym wyrażeniem CASE
.
Wewnątrz instrukcji SELECT
, proste wyrażenie CASE
pozwala tylko na sprawdzenie równości; żadne inne porównania nie są wykonywane. Poniższy przykład używa wyrażenia CASE
do zmiany wyświetlania kategorii linii produktów, tak 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
Użycie instrukcji SELECT
z przeszukiwanym wyrażeniem CASE
.
Wewnątrz instrukcji SELECT
, przeszukiwane wyrażenie CASE
pozwala na zamianę wartości w zestawie wyników na podstawie wartości porównania. Poniższy przykład wyświetla cenę katalogową jako komentarz tekstowy na podstawie zakresu cen dla 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
Użycie CASE
w klauzuli ORDER BY
.
Poniższe przykłady wykorzystują wyrażenie CASE
w klauzuli ORDER BY
do określenia kolejności sortowania wierszy na podstawie wartości danej kolumny. W pierwszym przykładzie, wartość w kolumnie SalariedFlag w tabeli HumanResources.Employee jest obliczana. Pracownicy, którzy mają ustawioną flagę SalariedFlag na 1 są zwracani w kolejności według BusinessEntityID w porządku malejącym. Pracownicy, którzy mają ustawioną flagę SalariedFlag na 0 są zwracani w kolejności według BusinessEntityID w kolejności rosnącej. W drugim przykładzie zestaw wyników jest uporządkowany według kolumny TerritoryName, gdy kolumna CountryRegionName jest równa 'United States' i według 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;
Użycie CASE
w instrukcji UPDATE
.
Poniższy przykład używa wyrażenia CASE
w instrukcji UPDATE
w celu określenia wartości ustawianej dla kolumny VacationHours dla pracowników z SalariedFlag ustawioną na 0. Jeśli odjęcie 10 godzin od VacationHours daje wartość ujemną, VacationHours jest zwiększane o 40 godzin; w przeciwnym wypadku VacationHours jest zwiększane o 20 godzin. Klauzula OUTPUT
jest używana 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;
Użycie CASE
w klauzuli HAVING
.
Poniższy przykład używa wyrażenia CASE
w klauzuli HAVING
do ograniczenia wierszy zwracanych przez instrukcję SELECT
. Polecenie zwraca maksymalną stawkę godzinową dla każdej nazwy stanowiska w tabeli HumanResources.Employee. Klauzula HAVING
ogranicza tytuły do tych, które są zajmowane przez mężczyzn z maksymalną stawką wynagrodzenia większą niż 40 dolarów lub kobiety z maksymalną stawką wynagrodzenia większą niż 42 dolary.
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;
Więcej szczegółów dotyczących tego przykładu można znaleźć na stronie źródło.
Odwiedź również tutaj i tutaj dla kilku przykładów z dużą ilością szczegółów.