Случай в Select Statement
У меня есть оператор 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
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, которую вы хотели бы изучить.
Ответ 2
Я думаю, что это может быть полезно для вас.
Использование оператора 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;
Ответ 3
вы также можете использовать:
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