A. 搭配簡單的 CASE 運算式使用 SELECT 陳述式
在 SELECT 陳述式內,只允許相等檢查使用簡單的 CASE 運算式,不能進行任何其他比較。下列範例利用 CASE 運算式來變更產品線類別目錄的顯示方式,使它們更容易了解。

SQL
USE AdventureWorks2008R2;
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
B. 搭配搜尋的 CASE 運算式使用 SELECT 陳述式
在 SELECT 陳述式內,搜尋的 CASE 運算式允許以比較值為基礎來取代結果集中的值。下列範例以產品的價格範圍為基礎,將標價顯示為文字註解。

SQL
USE AdventureWorks2008R2;
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
C. 使用 CASE 來取代用於 Microsoft Access 的 IIf 函數
CASE 提供類似於 Microsoft Access 中 IIf 函數的功能。下列範例顯示使用 IIf 的簡單查詢,來為名稱為 db1.ContactInfo 之 Access 資料表中的 TelephoneInstructions 資料行提供輸出值。

SELECT FirstName, LastName, TelephoneNumber,
IIf(IsNull(TelephoneInstructions),"Any time",
TelephoneInstructions) AS [When to Contact]
FROM db1.ContactInfo;
下列範例使用 CASE 來為 AdventureWorks2008R2 檢視中的 TelephoneSpecialInstructions 資料行提供輸出值 Person.vAdditionalContactInfo。

SQL
USE AdventureWorks2008R2;
GO
SELECT FirstName, LastName, TelephoneNumber, 'When to Contact' =
CASE
WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time'
ELSE TelephoneSpecialInstructions
END
FROM Person.vAdditionalContactInfo;
D. 在 ORDER BY 子句中使用 CASE
下列範例在 ORDER BY 子句中使用 CASE 運算式,根據給定的資料行值,決定資料列的排序次序。在第一則範例中,系統會評估 HumanResources.Employee 資料表之 SalariedFlag 資料行的值。將 SalariedFlag 設定為 1 的員工會以 EmployeeID 的遞減順序傳回。將 SalariedFlag 設定為 0 的員工會以 EmployeeID 的遞增順序傳回。在第二則範例中,結果集會依照資料行 TerritoryName 排序 (當資料行 CountryRegionName 等於 'United States' 時) 以及依照 CountryRegionName 排序 (針對所有其他資料列)。

SQL
SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO
SQL
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;
E. 在 UPDATE 陳述式中使用 CASE
下列範例在 UPDATE 陳述式中使用 CASE 運算式來決定 SalariedFlag 設定為 0 時,針對員工之 VacationHours 資料行設定的值。從 VacationHours 減去 10 小時變成負值時,VacationHours 會加上 40 小時,否則 VacationHours 會加上 20 小時。OUTPUT 子句用於顯示假期值之前和之後。

SQL
USE AdventureWorks2008R2;
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;
F. 在 SET 陳述式中使用 CASE
下列範例會在資料表值函式 dbo.GetContactInfo 的 SET 陳述式中使用 CASE 運算式。在 AdventureWorks2008R2 資料庫中,與人員相關的所有資料都會儲存在 Person.Person 資料表中。例如,該人員可能是員工、廠商代表或客戶。此函數會傳回給定之 BusinessEntityID 的姓名,以及該人員的連絡類型。SET 陳述式中的 CASE 運算式會根據 Employee、Vendor 或 Customer 資料表中的 BusinessEntityID 資料行是否存在,決定要針對 ContactType 資料行顯示的值。

SQL
USE AdventureWorks2008R2;
GO
CREATE FUNCTION dbo.GetContactInformation(@BusinessEntityID int)
RETURNS @retContactInformation TABLE
(
BusinessEntityID int NOT NULL,
FirstName nvarchar(50) NULL,
LastName nvarchar(50) NULL,
ContactType nvarchar(50) NULL,
PRIMARY KEY CLUSTERED (BusinessEntityID ASC)
)
AS
-- Returns the first name, last name and contact type for the specified contact.
BEGIN
DECLARE
@FirstName nvarchar(50),
@LastName nvarchar(50),
@ContactType nvarchar(50);

-- Get common contact information
SELECT
@BusinessEntityID = BusinessEntityID,
@FirstName = FirstName,
@LastName = LastName
FROM Person.Person
WHERE BusinessEntityID = @BusinessEntityID;

SET @ContactType =
CASE
-- Check for employee
WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e
WHERE e.BusinessEntityID = @BusinessEntityID)
THEN 'Employee'

-- Check for vendor
WHEN EXISTS(SELECT * FROM Person.BusinessEntityContact AS bec
WHERE bec.BusinessEntityID = @BusinessEntityID)
THEN 'Vendor'

-- Check for store
WHEN EXISTS(SELECT * FROM Purchasing.Vendor AS v
WHERE v.BusinessEntityID = @BusinessEntityID)
THEN 'Store Contact'

-- Check for individual consumer
WHEN EXISTS(SELECT * FROM Sales.Customer AS c
WHERE c.PersonID = @BusinessEntityID)
THEN 'Consumer'
END;

-- Return the information to the caller
IF @BusinessEntityID IS NOT NULL
BEGIN
INSERT @retContactInformation
SELECT @BusinessEntityID, @FirstName, @LastName, @ContactType;
END;

RETURN;
END;
GO

SELECT BusinessEntityID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(2200);
GO
SELECT BusinessEntityID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(5);
G. 在 HAVING 子句中使用 CASE
下列範例會在 HAVING 子句中使用 CASE 運算式來限制 SELECT 陳述式所傳回的資料列。此陳述式會在 HumanResources.Employee 資料表中,傳回每個職稱的時薪上限。HAVING 子句會將職稱限制為薪水上限大於 40 美金之男士所持有的職稱,以及薪水上限大於 42 美金之女士所持有的職稱。

SQL
USE AdventureWorks2008R2;
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;

abort 發表在 痞客邦 PIXNET 留言(0) 人氣()