2011-06-17 3 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 

UPDATEを求めているものの例です:私は共通テーブル式を使用していると私は、動的SQLを使用して試してみた、と声明への場合でも、やっていることが含まれているべきだと思います別のCTEを呼び出すのですが、CTEは単純なselectステートメント以外の何ものも好きではないようです。

アドバイスをいただき、ありがとうございます。

+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それは正しいですが、fieldset 'tableA。* + tableB。*'に同じ列、 'tableA。* + tableC。* 'と同じ型がある場合にのみ動作します。私が意味することは、 'union'は、同じ列型の2つ以上のデータセットでのみ動作することです。 –

+0

ありがとう、これはうまくいきました。私はちょうど組合で各CTEを呼び出しています。@category = "..." – jhorton

+0

@ジョイスポイント、私はスキーマが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