2009-05-20 58 views
2

我有一個SP具有以下算法。SQL Server 2005 - 如果條件與聯盟

IF <SomeCondition> 
BEGIN 
    SELECT * FROM TABLE1 
END 
ELSE 
BEGIN 
    SELECT * FROM TABLE2 
END 
--Union the above with the query below 
UNION 
    SELECT * FROM TABLE3 

返回的記錄集完全相同。我需要做一個結果集的聯合和另一個查詢。

有沒有辦法做到這一點,而不必使用臨時表?

+1

確保這三個表具有相同的結構。 – 2009-05-20 22:58:48

回答

8

如何:

SELECT * FROM TABLE1 WHERE <SomeCondition> 
UNION 
SELECT * FROM TABLE2 WHERE NOT <SomeCondition> 
UNION 
SELECT * FROM TABLE3 

如果你擔心評估兩次:

DECLARE @condition bit 
SET @condition = CASE WHEN <SomeCondition> THEN 1 ELSE 0 END 

SELECT * FROM TABLE1 WHERE @condition = 1 
UNION 
SELECT * FROM TABLE2 WHERE @condition = 0 
UNION 
SELECT * FROM TABLE3 
3

你也可以使用動態SQL,如果你不介意的話,它不是編譯。例如:

DECLARE @sql VARCHAR(100) 
DECLARE @table VARCHAR(10) 

IF <SomeCondition> 
BEGIN 
    SET @table = 'Table1' 
END 
ELSE 
BEGIN 
    SET @table = 'Table2' 
END 

SET @sql = 'SELECT * FROM ' + @table + ' UNION SELECT * FROM TABLE3' 
EXEC(@sql) 
0

此外,如果你可以得到UNION ALL通過代替UNION的,這樣做 - 可能會更便宜不消除重複