2016-10-20 21 views
0

ちょっと私は簡単に答えを見つけることができないことに驚いています。基本的には、値が1の場合にのみテーブルに参加しようとしています。私はケースステートメントを使用しようとしましたが、これはうまくいかないので、私は辛抱強く、いくつかの提案を高く評価します。値が1の場合にのみ結合します

基本的に私は渡されたテーブル@courseSectionとローカル変数@isSelectall = 0を持っています。だから、@courseSectionテーブルの-1をチェックしたいと思います。

擬似コード:

 If @courseSection contains -1 then 
     @isSelectAll = 1 
     end 

     if @isSelect all = 1 then 
     inner join course s on c.id = cs.id 
     end 

これはあまりにもすべてのSelectステートメントの内側にあります。どのようにこれを達成するための助言のための事前に感謝の誰にも提案をしています。

+2

「INNER JOINコースs ON c.id = cs.id AND @isSelectAll = 1'」というように、「ON」に入れることができます。つまり、 '@isSelectAll <> 1'のときに' INNER JOIN'が0レコードを見つけるので、 'LE NOT JOIN'に' IS NOT NULL'を使って結合を変更しなければならないかもしれません。 – Santi

+2

Oracle? MS-SQL? MYSQL?より多くの情報が必要です。 – gdoron

答えて

0

動的クエリを使用する必要があります。Joinテーブルに基づいてCASEの評価を行うことはできません。

Declare @sql varchar(max)= '' 

Set @sql = 'your current query without join' 

Set @sql += case when @isSelect all = 1 then ' inner join course s on c.id = cs.id ' 
      else '' end 

--print @sql 
Exec (@sql) 
0

あなただけ時々参加行いたい場合は、結合テーブルからこれらの列のいずれかを使用してはいけない、とだけフィルタとして参加しているの - それ以外の場合は意味がありませんが。

それがそうであった場合は、代わりにjoinの、inまたはexistsの操作を行います。

select * from MyTable 
where (@isSelectall <> 1 or id in (select id from course)) 

あなたが実際にcourseから列の一部を使用している場合は、そのleft joinを行う必要があるだろうコメントから、または動的SQLを他の答えのように。

関連する問題