Случай в заявлении Select

142

У меня есть оператор SQL, у которого есть CASEfrom, 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
Fadzli Feizal
источник
Мой ответ, объясняющий два типа case 1. Простое выражение CASE 2. Выражения CASE с поиском. И использование регистра обоих типов в запросах SELECT, UPDATE, With ORDER BY, With HAVING.
Сомнатх Мулук,

Ответы:

197

MSDN - хороший справочник для подобных вопросов, касающихся синтаксиса и использования. Это со страницы Справочник по Transact SQL - 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, которую вы хотели бы изучить.

NuNn DaDdY
источник
84

Я думаю, это может быть вам полезно.

Использование 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.Employee. Сотрудники, у которых для SalariedFlag установлено значение 1, возвращаются BusinessEntityID в порядке убывания. Сотрудники, у которых для SalariedFlag установлено значение 0, возвращаются BusinessEntityID в порядке возрастания. Во втором примере набор результатов упорядочен по столбцу TerritoryName, когда столбец CountryRegionName равен «United States», и по 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 часов; в противном случае VacationHours увеличивается на 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.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;

Для более детального описания этого примера посетите источник .

Также посетите здесь и здесь, чтобы увидеть несколько примеров с подробностями.

Сабир Аль Фатех
источник
Очень признателен за такой подробный ответ.
Aneeq Azam Khan
14

вы также можете использовать:

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
источник