2013-08-21 26 views
0

當我有多個連接並且傳遞給它們的變量爲空時,我遇到了問題。我想知道如何在值爲空時忽略連接。我認爲我可以這樣做,但是當這些參數中的任何一個具有價值而其餘的不具備價值時,這並沒有給我帶來正確的結果。如何在變量爲空時忽略連接

@param1 int = NULL 
,@param2 int = NULL 
,@param3 int = NULL 

SELECT t.ID,t.Col1 FROM Table t 
JOIN RelationalTable1 t1 ON (@param1 IS NULL) OR (t1.ID1 = t.ID AND t1.ID2 = @param1) 
JOIN RelationalTable2 t2 ON (@param2 IS NULL) OR (t2.ID1 = t.ID AND t2.ID2 = @param2) 
JOIN RelationalTable3 t3 ON (@param3 IS NULL) OR (t3.ID1 = t.ID AND t3.ID2 = @param3) 

如何讓這些連接消失,當他們的參數爲空?

+1

結果不正確?請舉一個例子。您可以在http://sqlfiddle.com上創建一個 –

+0

當所有參數都是emtpy時它返回0結果,或者當1+參數不爲null時它不返回數據複合。 –

+0

你應該寫dymanic sql來處理這個問題。你不能忽略一個連接。如果它只有2或3個參數,你可以使用If結構編寫單獨的選擇,但是3個以上的參數很快就會失控,甚至有3個參數可以手動處理。 – HLGEM

回答

1

看起來您正在使用連接作爲過濾器,並且您希望在參數爲NULL時保留所有內容。

我的建議是切換到left outer join

SELECT t.ID, t.Col1 
FROM Table t LEFT JOIN 
    RelationalTable1 t1 
    ON (@param1 IS NULL) OR (t1.ID1 = t.ID AND t1.ID2 = @param1) LEFT JOIN 
    RelationalTable2 t2 
    ON (@param2 IS NULL) OR (t2.ID1 = t.ID AND t2.ID2 = @param2) LEFT JOIN 
    RelationalTable3 t3 
    ON (@param3 IS NULL) OR (t3.ID1 = t.ID AND t3.ID2 = @param3) 
WHERE ((@param1 IS NULL) or (t1.ID is not null)) and 
     ((@param2 IS NULL) or (t2.ID is not null)) and 
     ((@param3 IS NULL) or (t3.ID is not null)); 

where子句說:「這裏的參數爲空或有相應表的匹配」。

我不確定在on子句中是否需要參數IS NULL。它會爲附加表中的每一行生成額外的多行。