Справа у виборі заяви


141

У мене є оператор SQL, який має CASEвід, SELECTі я просто не можу його зрозуміти. Чи можете ви, хлопці, покажіть мені приклад того, CASEде випадки є умовами, а результати - від справ. Наприклад:

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

де результати показують

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

Моя відповідь, що пояснює два типи випадків 1. Простий вираз CASE 2. Шукані вирази CASE. І використання обох типів у SELECT, UPDATE, ORDER BY, HAVING на запити.
Сомнат Мулук

Відповіді:


195

MSDN є хорошим посиланням на такі питання щодо синтаксису та використання. Це на сторінці 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

Ще один хороший сайт, який ви можете перевірити, чи використовуєте ви SQL Server, - це SQL Server Central . Для цього існує велика кількість ресурсів для будь-якої області SQL Server, яку ви хочете вивчити.


82

Я думаю, що це може бути для вас корисним.

Використання SELECTвисловлювання з простим CASEвиразом

Всередині SELECTвисловлювання простий CASEвираз допускає лише перевірку рівності; інших порівнянь не проводиться. У наступному прикладі CASEвираз використовується для зміни відображення категорій ліній продуктів, щоб зробити їх більш зрозумілими.

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

Використання SELECTзаяви з CASEвиразом, що шукається

В рамках SELECTоператора вираз, що шукається, CASEдозволяє замінювати значення у наборі результатів на основі значень порівняння. У наступному прикладі відображається ціна списку у вигляді текстового коментаря на основі цінового діапазону товару.

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

Використання CASEв ORDER BYпункті

Наступні приклади використовують CASEвираз у ORDER BYпункті для визначення порядку сортування рядків на основі заданого значення стовпця. У першому прикладі оцінюється значення в стовпці SalariedFlag таблиці HumanResources.E Employee. Співробітники, у яких SalariedFlag встановлено 1, повертаються в порядку BusinessEntityID у порядку зменшення. Співробітники, для яких SalariedFlag встановлено 0, повертаються в порядку BusinessEntityID у порядку зростання. У другому прикладі набір результатів впорядковується стовпцем TerritoryName, коли стовпець CountryRegionName дорівнює "Сполучені Штати" та CountryRegionName для всіх інших рядків.

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;

Використання CASEу UPDATEвиписці

Наступний приклад використовує CASEвираз у UPDATEвиписці, щоб визначити значення, встановлене для стовпця VacationHours для співробітників із SalariedFlag, встановленим на 0. При відніманні 10 годин від VacationHours приводиться до від’ємного значення, VacationHours збільшується на 40 годин; в іншому випадку вакансії збільшуються на 20 годин. Ця OUTPUTстаття використовується для відображення значень до відпустки та після неї.

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; 

Використання CASEв HAVINGпункті

У наступному прикладі використовується CASEвираз у HAVINGпункті для обмеження рядків, повернених у SELECTоператорі. Виписка повертає максимальну погодинну ставку для кожного найменування роботи в таблиці HumanResources.E Employee. HAVINGПункт обмежує назви тим , які займають чоловіки з максимальною більшою швидкістю , ніж платити 40 доларів або жінки з більшою швидкістю , ніж платити максимальний 42 доларів.

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;

Більш детально опис цього прикладу відвідайте джерело .

Також завітайте сюди і сюди, щоб отримати кілька прикладів із великими подробицями.


Дійсно оцініть таку детальну відповідь.
Анек Азам Хан

12

Ви також можете використовувати:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.