2011-12-20 15 views
0

すぐにバットをオフ - 私は非常に 'ケース'に新しいです。私は以下を読む:How do I perform an IF...THEN in an SQL SELECT?しかし、それは本当に私の質問に答えていない。ケースを使用する場合 - これは可能ですか?

select 
    section_name, * 
from 
    property.lease_period lp 
where 
    lp.lease_current_stop_date < getdate() and (lp.lease_status = 'Active' or lp.lease_status = 'Overholding') 
    and lp.period_id = @period_id 
    and lp.building_id = @building_id 
    and not exists 
    (
     select 1 
     from lease_deal.lease 
     where lp.suite_name = tenancy_reference 
     and lp.building_id = building_id 
    ) 
    case when(@section_name <> 'ALL') 
    then(and upper(section_name) = upper(@section_name)) 
    end 
order by period_id desc 

はこれが可能である:

は、基本的に次の線に沿って何か私がやろうとしているのですか?もしそうなら、私は何が間違っているのですか?

T1が; DR:

基本的に私は希望:@section_nameが 'ALL' と等しくないとき

and upper(section_name) = upper(@section_name) 

だけには私のwhere句には適用され

+0

select *は使用しないでください。ここでsection_nameを2回返すと、サーバーリソースが無駄になります。あなたが参加していれば同じことが起こります。 Plus select *は単独では遅くなります。実際に必要な列のみを使用してください。 – HLGEM

+0

しかし、このSQLはSSRSレポートに使用されていることに同意します。通常のコールポイントでは、すべての列を選択してから、レポートが使用するすべてのことを知ってから、より具体的にクエリを変更します開発プロセス全体を通じて追加データを要求する)。 私はここでlp。*を使用していたはずであることを認めています - 宣言自体は悪い習慣です。 – Codingo

答えて

3

あなただけのことができますあなたの(動作していない)ケースを

に変更してください。
AND (@section_name = 'ALL' OR upper(section_name) = upper(@section_name)) 
+2

そして、あなたのサーバがCASE-censitiveされていない場合 - あなただけ(かもしれない)より高い性能を得るためにして使用するUPPER関数をスキップすることができ、適切なインデックスの代わりに 'OR' –

+0

' AND' - 実際OR、慎重8をそれを読みます - ) –

+0

ないの –

0
AND upper(section_name)=CASE WHEN @section_name <> 'ALL' THEN upper(@section_name) 
                 ELSE upper(section_name) 
         END 
1

これは、CASEを使用する必要なく、より簡単な方法で実行できます。これは次のようなものになります。

and ((upper(section_name) = upper(@section_name) and @section_name <> 'ALL') OR @section_name ='ALL') 
+0

優秀!興味のために、上で概説したことをケースで達成する方法はありますか? – Codingo

関連する問題