2012-04-29 9 views
1

私はこのようなことを私の質問ではCASE WHENでやろうとしていますが、AND部分を取っていません。構文上のエラーは、& &のどちらでもないと言います。私はSQLの教祖の多くにではないので、私は助けていただければ幸いです。条件を使用するこのケースの式で何が問題になっていますか?

Total = 
       CASE Payment.ID 
        WHEN 1 THEN mytable.Total 
        WHEN 4 AND trans.Amount IS NULL THEN mytable.Total 
        WHEN 4 AND trans.Amount IS NOT NULL THEN mytable.Total - trans.Amount 
        ELSE '0' 
       END, 
+0

ここで使用している変数は実際には表示されません。タイトルに誤りがありますか、コードの一部を書き換えたり変更したりしましたか? –

+0

誰も私のためにそれを変更したと思います... – user710502

+0

私はそれを変更しました。誰が "変数"を使用していたと言うのか分かりません。 – user710502

答えて

5

これは、これを行う方法の1つです。式を次のように変更します。

スクリプト

Total = (CASE 
      WHEN Payment.ID = 1 
       THEN mytable.Total 
      WHEN Payment.ID = 4 
       AND trans.Amount IS NULL 
        THEN mytable.Total 
      WHEN Payment.ID = 4 
       AND trans.Amount IS NOT NULL 
        THEN mytable.Total - trans.Amount 
      ELSE '0' 
     END), 

CASE式、すなわちSimpleSearchedの2種類があります。 SimpleとSearchedを同じ式で組み合わせることはできません。

シンプル

CASE input 
    WHEN 1 THEN 'a' 
    WHEN 2 THEN 'b' 
    WHEN 3 THEN 'c' 
    ELSE '' 
END 

検索 - Example 1を:最も単純な形で。

CASE 
    WHEN input = 1 THEN 'a' 
    WHEN input = 2 THEN 'b' 
    WHEN input = 3 THEN 'c' 
    ELSE '' 
END 

検索 - Example 2を:複数の列を伴います。各WHENステートメントに複数の列を追加できます。

CASE  
    WHEN input = 1 AND second_column = 2 THEN 'a' 
    WHEN input = 2 AND third_column = 3 THEN 'b' 
    WHEN input = 3 AND (second_column = 4 OR third_column = 6) THEN 'c' 
    ELSE '' 
END 
+0

*検索した*の利点を指摘する価値がありますすべて同じ列( 'input')を必要とし、任意に複雑にすることができます。 –

5

私は、これは同じクエリを表現するはるかに簡単な方法だと思います:

Total = CASE Payment.ID 
    WHEN 1 THEN myTable.Total 
    WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0) 
    ELSE 0 
END, 

2つだけの可能な結果があるので、私たちはだけは本当に(私たちはどちらかだ= 4 Payment.IDの条件1を必要としますtrans.Amountを減算するか、そうでない場合はCOALESCE(またはISNULL)を使用して簡略化できます)。もちろん、それを表現するための他の方法もあり、彼らはすべてそのメリットを持っています。 myTable.Totalは、実際にはもっと複雑な式である場合、それは、少なくともキーストロークの面で、より効率的かもしれのみ少し周りのロジックをシャッフルすることにより、あなたが行うことができ、一度その式を言及する:

Total = CASE WHEN Payment.ID IN (1,4) 
    THEN myTable.Total - CASE WHEN Payment.ID = 4 THEN 
    COALESCE(trans.Amount, 0) ELSE 0 END 
    ELSE 0 
END, 

Total = CASE 
    WHEN Payment.ID = 1 THEN 
    myTable.Total 
    WHEN Payment.ID = 4 AND trans.Amount IS NULL THEN 
    myTable.Total 
    WHEN Payment.ID = 4 AND trans.Amount IS NOT NULL NULL THEN 
    mytable.Total - trans.Amount 
    ELSE 
    0 
END, 

しかし、この場合には、あなたがそこに反復のたくさんを持っていて、一つの式を3回言及:あなたの元のコードに最も近い有効な構文は次のとおりです。いくつかのケースでは、これは、パフォーマンスに悪影響を及ぼす可能性が(その式は、サブクエリやUDFの呼び出しとして、計算することが高価だった、とクエリロジックは、それが複数回計算される原因となった場合を想像)。時には、エンジンは、あなたがそれを賢明にしようとするにせよ、エンジンがやろうとしていることをするつもりですが、あなたが気をつけなければ間違った道に導くことは確かです。

キーは、CASEが単一の値を返す式であることを理解することです。多くの人々は他の言語から来て、それが流れの制御のために使うことができると仮定します。

+0

あなたの "より単純な"クエリは、特に、Payment.ID = 1のときに、trans.Amountを減算します。質問で何かが間違っていない限り、ID = 1でAmount isn ' tはゼロまたはゼロである。 –

+0

完全に正しいスティーブ、良いキャッチ!そのバージョンを完全に削除しました。 –

+0

COALESCEの機能は何ですか? – user710502

関連する問題