我覺得這可能是對你有幫助。
使用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
在ORDER BY
子句
以下實施例使用CASE
使用CASE
表達在ORDER BY
子句確定基於給定的列值的行的排列順序。在第一個示例中,評估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
語句
下面的示例使用在UPDATE
語句CASE
表達式來確定,它被設置爲列VacationHours員工與SalariedFlag設置爲0。當使用值CASE
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
子句限制由SELECT
語句返回的行使用CASE
。該聲明返回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;
對於這些例子的更多細節描述訪問source。
有關詳細信息,請訪問here和here。
[我的答案](http://stackoverflow.com/a/38874485/1045444)解釋兩種情況類型1.簡單CASE表達式2.搜索CASE表達式。並且在SELECT,UPDATE,WITH ORDER BY和HAVING查詢中都使用這兩種類型的用例。 –