2011-09-16 59 views
32

有沒有辦法使用IN子句創建CASE語句?具有多個值的CASE IN語句

SELECT 
CASE c.Number 
IN ('1121231','31242323') THEN 1 
IN ('234523','2342423') THEN 2 
END AS Test 
FROM tblClient c 

回答

68

是的。你需要使用「搜索」的形式,而不是CASE表達的「簡單」形式

SELECT CASE 
     WHEN c.Number IN ('1121231', '31242323') THEN 1 
     WHEN c.Number IN ('234523', '2342423') THEN 2 
     END AS Test 
FROM tblClient c 
5

您可以從幾場比賽返回相同的值:

SELECT 
    CASE c.Number 
    WHEN '1121231' THEN 1 
    WHEN '31242323' THEN 1 
    WHEN '234523' THEN 2 
    WHEN '2342423' THEN 2 
    END AS Test 
FROM tblClient c 

這可能會導致與Martins的建議相同的執行計劃,所以更多的是你想如何編寫它的問題。

+1

問題是您沒有使用'in'語句,因此您沒有真正回答問題 –

+0

@ t-clausen.dk:如果您只想完全按照所述回答問題,唯一可能的答案是「No 「,這不是很有建設性。 – Guffa

+0

答案「不」是?我總是用'IN'寫'CASE'語句......就像馬丁史密斯那樣。 –

0

如果您有更多的數字或如果你打算爲CASE增加新的測試號碼,那麼你可以使用更靈活的方法:

DECLARE @Numbers TABLE 
(
    Number VARCHAR(50) PRIMARY KEY 
    ,Class TINYINT NOT NULL 
); 
INSERT @Numbers 
VALUES ('1121231',1); 
INSERT @Numbers 
VALUES ('31242323',1); 
INSERT @Numbers 
VALUES ('234523',2); 
INSERT @Numbers 
VALUES ('2342423',2); 

SELECT c.*, n.Class 
FROM tblClient c 
LEFT OUTER JOIN @Numbers n ON c.Number = n.Number; 

此外,而不是表變量,你可以使用一個常規表。