2011-09-16 75 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; 

此外,而不是表变量,你可以使用一个常规表。