Case w instrukcji Select

141

Mam instrukcję SQL, która ma CASEfrom SELECTi po prostu nie mogę tego zrobić poprawnie. Czy możecie mi pokazać przykład, CASEgdzie 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 pokazują wyniki

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry
fadzli feizal
źródło
Moja odpowiedź wyjaśniająca dwa typy przypadków 1. Proste wyrażenie CASE 2. Szukane wyrażenia CASE. I zastosowanie obu typów w SELECT, UPDATE, With ORDER BY, With HAVING queries.
Somnath Muluk

Odpowiedzi:

195

MSDN jest dobrym źródłem informacji na tego typu pytania dotyczące składni i użycia. To pochodzi ze strony 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

Inną dobrą witryną, którą możesz chcieć sprawdzić, jeśli używasz SQL Server, jest SQL Server Central . Zawiera ona szeroką gamę zasobów dostępnych dla dowolnego obszaru SQL Server, którego chcesz się nauczyć.

NuNn DaDdY
źródło
82

Myślę, że te mogą być pomocne dla Ciebie.

Używanie SELECTinstrukcji z prostym CASEwyrażeniem

W SELECTinstrukcji proste CASEwyrażenie pozwala tylko na sprawdzenie równości; nie dokonuje się innych porównań. Poniższy przykład używa CASEwyrażenia, 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

Użycie SELECTinstrukcji z wyszukiwanym CASEwyrażeniem

W SELECTinstrukcji wyszukiwane CASEwyrażenie umożliwia zastąpienie wartości w zestawie wyników na podstawie wartości porównawczych. 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żywanie CASEw ORDER BYklauzuli

W poniższych przykładach użyto CASEwyrażenia w ORDER BYklauzuli, aby określić kolejność sortowania wierszy na podstawie danej wartości kolumny. W pierwszym przykładzie obliczana jest wartość w kolumnie SalariedFlag tabeli HumanResources.Employee. Pracownicy, dla których SalariedFlag ustawiono na 1, są zwracani w kolejności malejącej przez BusinessEntityID. Pracownicy, dla których SalariedFlag jest ustawiona na 0, są zwracani w kolejności rosnącej przez BusinessEntityID. 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 pozostałych 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żywanie CASEw UPDATEoświadczeniu

Poniższy przykład używa CASEwyrażenia w UPDATEinstrukcji, aby określić wartość ustawioną dla kolumny VacationHours dla pracowników z SalariedFlag ustawioną na 0. Gdy odejmowanie 10 godzin od VacationHours daje wartość ujemną, VacationHours jest zwiększana o 40 godzin; w przeciwnym razie Urlop jest wydłużony o 20 godzin. OUTPUTKlauzula jest używany do wyświetlania przed i po wartości wakacje.

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żywanie CASEw HAVINGklauzuli

Poniższy przykład używa CASEwyrażenia w HAVINGklauzuli, aby ograniczyć wiersze zwracane przez SELECTinstrukcję. Oświadczenie zwraca maksymalną stawkę godzinową dla każdego stanowiska w tabeli HumanResources.Employee. HAVINGKlauzula ogranicza tytułów do tych, które są utrzymywane przez mężczyzn z maksymalnym większym stopniu wynagrodzenie niż 40 dolarów lub kobiet z maksymalnym większym stopniu wynagrodzenie 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 szczegółowych informacji na temat tego przykładu, odwiedź źródło .

Odwiedź również tutaj i tutaj, aby uzyskać kilka przykładów ze szczegółami.

Sabir Al Fateh
źródło
Naprawdę doceniam tak szczegółową odpowiedź.
Aneeq Azam Khan
12

możesz także 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
user5035983
źródło