2014-11-05 148 views
0

我有一个包含Id,Name和Active列的表'Route'。如果Id = 0,我想选择其中Active = true的所有Id。SQL语句中的WHERE子句陈述

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

我试着用下面的查询。但不工作。 (在这里我通过了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

+0

我试过了。但失败 – Tom 2014-11-05 09:50:12

+0

是'活跃'一个字符串字段(''True'')还是一个整数字段('1')? – 2014-11-05 09:57:42

+0

Active是一个Boolian字段 – Tom 2014-11-05 10:01:03

回答

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 

一个。如果@ID> 0,那么Id = @ID AND Active = 1

b。其他活动= 1

如果你看看这两种情况下密切合作,主动= 1保持在两种情况下相同的,因此它可以被安全地送到外部条件的

那么剩下的部分是,如果@ID> 0那么Id = @ID即当参数有效值时按照参数值选择行,否则选择全部。

所以,如果你把它都成为

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

是的,检查它是否给你想要的输出。否则,您可以提供样本数据和预期结果。这样我们就可以验证 – Satyajit 2014-11-05 09:59:27

+0

在这里即使我通过3为Id仍然显示所有数据。 – Tom 2014-11-05 10:04:02

+0

'='附近的语法错误。 – Tom 2014-11-05 10:09:46