我认为这些对你可能有帮助。
使用简单的CASE表达式和SELECT语句
在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
使用带有搜索的 CASE
表达式的SELECT
语句
在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
在 ORDER BY
子句中使用 CASE
以下示例在 ORDER BY
子句中使用 CASE
表达式来确定基于给定列值的行的排序顺序。在第一个示例中,评估了 HumanResources.Employee 表的 SalariedFlag 列中的值。将 SalariedFlag 设置为 1 的员工按 BusinessEntityID 以降序返回。将 SalariedFlag 设置为 0 的员工按 BusinessEntityID 以升序返回。在第二个示例中,当 CountryRegionName 列等于“United States”时,结果集按 TerritoryName 列排序,否则按 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;
在 UPDATE
语句中使用 CASE
以下示例使用 CASE
表达式在 UPDATE
语句中确定为 SalariedFlag 设置为 0 的员工设置的列 VacationHours 的值。当从 VacationHours 中减去 10 小时导致负值时,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;
在HAVING子句中使用CASE表达式
下面的示例在HAVING子句中使用CASE表达式,限制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;
要了解这些示例的详细说明,请访问此处。
另外,访问此处和此处,以获取一些具有详细说明的示例。