有没有办法做一个CASE语句与IN子句?
SELECT
CASE c.Number
IN ('1121231','31242323') THEN 1
IN ('234523','2342423') THEN 2
END AS Test
FROM tblClient c
是。你需要使用“搜索”的形式,而不是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
您可以返回从几场比赛相同的值:
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
这可能会导致在相同的执行计划,马丁斯的建议,所以它更多的你想怎么写的问题。
现在的问题是特定于SQL Server,但我想延长Martin Smith's answer。
SQL:2003标准允许为简单情况表达式定义多个值:
SELECT CASE c.Number
WHEN '1121231','31242323' THEN 1
WHEN '234523','2342423' THEN 2
END AS Test
FROM tblClient c;
这是可选功能:Comma-separated predicates in simple CASE expression“ (F263)。
句法:
CASE <common operand>
WHEN <expression>[, <expression> ...] THEN <result>
[WHEN <expression>[, <expression> ...] THEN <result>
...]
[ELSE <result>]
END
至于知道我不知道,实际上支持语法的RDBMS的。
如果您有更多的数字或如果你打算为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;
此外,而不是表变量,你可以使用一个常规表。