2011-06-17 74 views
0

我有一個變量,我需要檢查,看看值是什麼,我需要做一個內部連接到不同的表基於什麼值。這裏是要問什麼,我的例子...如何有條件地將內部連接添加到select語句?

Declare @category nvarchar(100) 

select * 
from tableA a 
if (@category = 'all) 
begin 
    inner join tableB b on b.ID = a.ID 
end 
else if (@category = 'open') 
begin 
    inner join tableC c on c.ID = a.ID 
end 

更新:我想我應該包括我使用公用表表達式,我已經嘗試使用動態SQL,甚至做if語句調用不同的CTE,但似乎CTE不喜歡任何東西,只是一個簡單的選擇語句。

感謝您對我的任何建議。

+0

您是否正在考慮使用參數化存儲過程? –

回答

2

一種方法是:

select * 
from tableA a 
inner join tableB b on b.ID = a.ID 
where @category = 'all' 
union all 
select * 
from tableA a 
inner join tableC c on c.ID = a.ID 
where @category = 'open' 
+0

+1這是正確的,但只有在字段集'tableA。* + tableB。*'具有相同的列,相同類型的'tableA。* + tableC。*'時纔有效。我的意思是,一個'union'只能在兩個或多個具有相同列類型的數據集上工作 –

+0

謝謝,這個工作。我只是打電話給每個CTE的工會和@category =「...」 – jhorton

+0

@Jose好點,我假設模式是相同的tableB和tableC; – RedFilter

0

讓你的整個查詢VARCHAR,然後使用動態執行。

declare @sqltorun as varchar(max) 
set @sqltorun = 'select * from tableA a ' 
if(@Category=='a') 
@sqltorun = @sqltorun + 'inner join tableB b on b.ID = a.ID ' 
else 
@sqltorun = @sqltorun + 'inner join tableB b on b.ID = a.ID ' 
sp_executesql @sqltorun