計(jì)算條件列表并返回多個(gè)可能結(jié)果表達(dá)式之一。
CASE 具有兩種格式:
簡單 CASE 函數(shù)將某個(gè)表達(dá)式與一組簡單表達(dá)式進(jìn)行比較以確定結(jié)果。
CASE 搜索函數(shù)計(jì)算一組布爾表達(dá)式以確定結(jié)果。
兩種格式都支持可選的 ELSE 參數(shù)。
Transact-SQL 語法約定
語法
Simple CASE function: CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END Searched CASE function:CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END 參數(shù)
input_expression
使用簡單 CASE 格式時(shí)所計(jì)算的表達(dá)式。input_expression 是任意有效的表達(dá)式。
WHEN when_expression
使用簡單 CASE 格式時(shí)要與 input_expression 進(jìn)行比較的簡單表達(dá)式。when_expression 是任意有效的表達(dá)式。input_expression 及每個(gè) when_expression 的數(shù)據(jù)類型必須相同或必須是隱式轉(zhuǎn)換的數(shù)據(jù)類型。
n
占位符,表明可以使用多個(gè) WHEN when_expression THEN result_expression 子句或多個(gè) WHEN Boolean_expression THEN result_expression 子句。
THEN result_expression
當(dāng) input_expression = when_expression 計(jì)算結(jié)果為 TRUE,或者 Boolean_expression 計(jì)算結(jié)果為 TRUE 時(shí)返回的表達(dá)式。result expression 是任意有效的表達(dá)式。
ELSE else_result_expression
比較運(yùn)算計(jì)算結(jié)果不為 TRUE 時(shí)返回的表達(dá)式。如果忽略此參數(shù)且比較運(yùn)算計(jì)算結(jié)果不為 TRUE,則 CASE 返回 NULL。else_result_expression 是任意有效的表達(dá)式。else_result_expression 及任何 result_expression 的數(shù)據(jù)類型必須相同或必須是隱式轉(zhuǎn)換的數(shù)據(jù)類型。
WHEN Boolean_expression
使用 CASE 搜索格式時(shí)所計(jì)算的布爾表達(dá)式。Boolean_expression 是任意有效的布爾表達(dá)式。
結(jié)果類型
從 result_expressions 和可選 else_result_expression 的類型集中返回優(yōu)先級(jí)最高的類型。有關(guān)詳細(xì)信息,請(qǐng)參閱 數(shù)據(jù)類型優(yōu)先級(jí) (Transact-SQL)。
結(jié)果值
簡單 CASE 函數(shù):
計(jì)算 input_expression,然后按指定順序?qū)γ總€(gè) WHEN 子句的 input_expression = when_expression 進(jìn)行計(jì)算。
返回 input_expression = when_expression 的第一個(gè)計(jì)算結(jié)果為 TRUE 的 result_expression。
如果 input_expression = when_expression 計(jì)算結(jié)果不為 TRUE,則在指定 ELSE 子句的情況下 SQL Server 2005 數(shù)據(jù)庫引擎將返回 else_result_expression;若沒有指定 ELSE 子句,則返回 NULL 值。
CASE 搜索函數(shù):
按指定順序?qū)γ總€(gè) WHEN 子句的 Boolean_expression 進(jìn)行計(jì)算。
返回 Boolean_expression 的第一個(gè)計(jì)算結(jié)果為 TRUE 的 result_expression。
如果 Boolean_expression 計(jì)算結(jié)果不為 TRUE,則在指定 ELSE 子句的情況下 數(shù)據(jù)庫引擎將返回 else_result_expression;若沒有指定 ELSE 子句,則返回 NULL 值。
示例
A. 使用帶有簡單 CASE 函數(shù)的 SELECT 語句
在 SELECT 語句中,簡單 CASE 函數(shù)僅檢查是否相等,而不進(jìn)行其他比較。以下示例使用 CASE 函數(shù)更改產(chǎn)品系列類別的顯示,以使這些類別更易理解。
復(fù)制代碼
USE AdventureWorks;GOSELECT 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, NameFROM Production.ProductORDER BY ProductNumber;GOB. 使用帶有簡單 CASE 函數(shù)和 CASE 搜索函數(shù)的 SELECT 語句
在 SELECT 語句中,CASE 搜索函數(shù)允許根據(jù)比較值在結(jié)果集內(nèi)對(duì)值進(jìn)行替換。下面的示例根據(jù)產(chǎn)品的價(jià)格范圍將標(biāo)價(jià)顯示為文本注釋。
復(fù)制代碼
USE AdventureWorks;GOSELECT 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' ENDFROM Production.ProductORDER BY ProductNumber ;GOC. 使用 CASE 代替 Microsoft Access 中使用的 IIf 函數(shù)
CASE 可與 Microsoft Access 中的 IIf 函數(shù)提供相似的功能。以下示例顯示一個(gè)簡單查詢,它使用 IIf 為名為 db1.ContactInfo 的 Access 表中的 TelephoneInstructions 列提供輸出值。
復(fù)制代碼
SELECT FirstName, Lastname, TelephoneNumber, IIf(IsNull(TelephoneInstructions),"Any time", TelephoneInstructions) AS [When to Contact]FROM db1.ContactInfo 以下示例使用 CASE 為 AdventureWorks 視圖中的 TelephoneSpecialInstructions 列提供輸出值,該視圖名稱為 Person.vAdditionalContactInfo。
復(fù)制代碼
USE AdventureWorksGOSELECT FirstName, Lastname, TelephoneNumber, 'When to Contact' = CASE WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time' ELSE TelephoneSpecialInstructions ENDFROM Person.vAdditionalContactInfo