Sql Server与If条件联合

时间:2012-11-01 12:21:03

标签: sql sql-server sql-server-2008 tsql

我有一个类似的查询:

DECLARE @tmpValue
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1
UNION 
IF @tmpValue > 0 
SELECT * FROM Animal WHERE.Active = 0

当我像这样使用它时会因为if条件而给出错误。由于我们的结构,我必须使用UNION。

我如何在条件下使用它?

谢谢,
约翰

4 个答案:

答案 0 :(得分:18)

将条件@tmpValue > 0移动到WHERE子句,如下所示:

SELECT * FROM Animal WHERE AniActive = 1
UNION
SELECT * FROM Animal WHERE @tmpValue > 0 AND Active = 0

答案 1 :(得分:3)

您可以像这样将条件添加到查询中。如果您的测试条件为假,则union的section部分将不会返回任何结果:

DECLARE @tmpValue

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1
UNION 
SELECT * FROM Animal WHERE.Active = 0 and @tmpValue > 0

答案 2 :(得分:3)

在Query中放置条件的最佳方法是CASE语句。你可以放任何数量的条件 在查询中。 CASE语句用于在Query中放置条件过滤器。

对于EX。

DECLARE @tmpValue
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1
UNION
SELECT * FROM Animal 
WHERE 
1 = CASE WHEN @tmpValue  = 0 THEN 0 ELSE Active = 1 END

您的情况并不复杂,但对于更复杂的情况,您可以在Query中使用嵌套的CASE语句。

答案 3 :(得分:0)

这是通过完全摆脱UNION来简化代码的方法。我总是喜欢一种更简单的解决方案。如果select执行表扫描,这也会表现得更好,因为它只扫描一次而不是(可能)扫描两次。

DECLARE @tmpValue

SET @tmpValue = 0 -- it will be change

SELECT * FROM Animal WHERE AniActive = 1 OR @tmpValue > 0