私は、これは同じクエリを表現するはるかに簡単な方法だと思います:
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
が単一の値を返す式であることを理解することです。多くの人々は他の言語から来て、それが流れの制御のために使うことができると仮定します。
ここで使用している変数は実際には表示されません。タイトルに誤りがありますか、コードの一部を書き換えたり変更したりしましたか? –
誰も私のためにそれを変更したと思います... – user710502
私はそれを変更しました。誰が "変数"を使用していたと言うのか分かりません。 – user710502