2016-12-30 103 views
0

當使用CASE語句,我知道具體根據documentation我可以使用一個簡單的CASE表達,與input_expression和對when_expressionresult_expression值(在這些例子中,在myField值始終爲正整數假設):在CASE語句中使用IN而不重複輸入表達式?

CASE [input_expression] 
    WHEN [when_expression] THEN [result_expression] 
    ... 
    ELSE [result_expression] 
END 


CASE myField 
    WHEN 1 THEN 'One' 
    WHEN 2 THEN 'Two' 
    WHEN 3 THEN 'Three' 
    ELSE 'More than three' 
END 

或我可以使用一個搜索CASE表達式中,用雙Boolean_expressionresult_expression值:

CASE 
    WHEN [Boolean_expression] THEN [result_expression] 
    ... 
    ELSE [result_expression] 
END 


CASE 
    WHEN myField = 1 THEN 'One' 
    WHEN myField = 2 THEN 'Two' 
    WHEN myField = 3 THEN 'Three' 
    ELSE 'More than three' 
END 

我也知道,我可以使用IN操作任何Boolean_expression的部分寫入一個搜索CASE表達式時:

CASE 
    WHEN myField IN (1,2) THEN 'One or two' 
    WHEN myField = 3 THEN 'Three' 
    ELSE 'More than three' 
END 

什麼是真正有用的將是能夠編寫簡單,當使用IN操作CASE表達,如:

CASE myField 
    WHEN IN (1,2,3) THEN 'Between one and three' 
    WHEN IN (4,5,6) THEN 'Between four and six' 
    WHEN IN (7,8,9) THEN 'Between seven and nine' 
    ELSE 'More than nine' 
END 

但這不會運行,並給出了錯誤:

Incorrect syntax near the keyword 'IN'.

顯然我上面的例子是人爲設計的,但有沒有什麼辦法可以寫出簡單的CASE表達式,還可以用IN這個運算符?

我從閱讀語法在MSDN上,它似乎這是不可能的,原因很簡單,CASE表達是如何形成的理解 - 比較input_expression每個when_expression平等 - 但我只是想知道如果有任何一種方式以實現我所要求的,因爲在搜索到的CASE表達式的每個WHEN子句中一遍又一遍地保存相同的字段名稱將會很方便。

+3

不可以。它沒有這樣的語法。最接近的就是你的第三個例子 – GurV

回答

2

不,這是不可能的。該文檔區分表達式布爾表達式。當表達式總是使用相等運算符時

阿龍貝特朗描述這個在他Dirty Secrets of the CASE expression,像這樣

SELECT CASE @variable 
    WHEN 1 THEN 'foo' 
    WHEN 2 THEN 'bar' 
END 

表達式計算爲

SELECT 
    WHEN @variable = 1 THEN 'foo' 
    WHEN @variable = 2 THEN 'bar' 
END 

所以沒有辦法使用when_expression更換比較操作。這僅與布爾表達式類似,您可能已經提到過:

SELECT 
    WHEN @variable IN (1,2) THEN 'foo' 
    WHEN @variable in (3,4) THEN 'bar' 
END