2012-11-01 37 views
10

我有這樣一個查詢:Sql Server的聯合與If條件

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 

當我使用這樣它給,因爲如果條件錯誤。由於我們的結構,我必須使用UNION。

如何在條件下使用它?

謝謝
約翰

回答

14

移動狀態@tmpValue > 0WHERE條款,像這樣:

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

您可以添加條件,這樣的查詢。如果您的測試條件爲false,則聯合的分節部分將簡單地返回無結果:

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 
3

將條件置於Query中的最佳方式是CASE語句。您可以在查詢中輸入任意數量的條件 。 CASE語句用於將條件過濾器置於Query中。

For 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語句。

0

下面是通過徹底擺脫UNION來簡化代碼的方法。我總是希望儘可能使用更簡單的解決方案。如果select執行表掃描,這也會更好,因爲它只會掃描一次,而不是(可能)兩次。

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

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