SQL中WHERE子句中的case语句

时间:2014-11-05 09:46:35

标签: sql sql-server stored-procedures

我有一个带有Id,Name和Active列的表'Route'。如果Id = 0,我想选择Active = true的所有Id。

如果Id> 0我想选择Active = true的特定Id的数据。

我尝试了以下查询。但不行。 (这里我传递了2作为Id值。) 有人可以支持我吗?

DECLARE @ID INT
SET @ID = 2

SELECT  DISTINCT Id ,Name 
FROM    Route 
WHERE
CASE WHEN @ID > 0 
THEN Id = @ID AND Active= 1
ELSE
Active=1
END

附加示例数据。

enter image description here

1 个答案:

答案 0 :(得分:2)

无需使用案例只能使用where子句。

DECLARE @ID INT
SET @ID = 2

SELECT  DISTINCT Id ,Name 
FROM    Route 
WHERE Active=1 AND (Id = @Id OR @Id = 0);

<强>解释

WHERE
CASE WHEN @ID > 0 
THEN Id = @ID AND Active= 1
ELSE
Active=1

一个。 if @ID&gt; 0然后Id = @ID AND Active = 1

湾其他活动= 1

如果仔细研究这两种情况,Active = 1在两种情况下都保持相同,因此可以安全地将其置于条件之外

然后剩下的部分是,如果@ID&gt; 0然后Id = @ID,即当参数具有有效值时根据参数值选择行,否则选择全部。

所以,如果你把它们结合起来就变成了

WHERE Active=1 AND (Id = @Id OR @Id = 0);