これは、同じクエリを表現するためのはるかに簡単な方法だと思います。
Total = CASE Payment.ID
WHEN 1 THEN myTable.Total
WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0)
ELSE 0
END,
Payment.ID
考えられる結果は2つしかないため、= 4の条件は1つだけ必要です(減算するか、減算しないかのどちらかです。 (または)trans.Amount
を使用してこれを簡略化できます)。もちろん、それを表現する方法は他にもあり、それらにはすべてメリットがあります。myTable.Totalが実際にはより複雑な式である場合、少なくともキーストロークに関しては、その式について1回だけ言及する方が効率的である可能性があります。これは、ロジックを少しシャッフルすることで実行できます。COALESCE
ISNULL
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,
しかし、この場合、そこには多くの繰り返しがあり、1つの表現に3回言及します。場合によっては、これはパフォーマンスに悪影響を与える可能性があります(サブクエリやUDF呼び出しなど、その式の計算にコストがかかり、クエリロジックによって複数回計算された場合を想像してください)。エンジンは、いくらそれを上回ろうとしても、エンジンがやろうとしていることをやろうとしていることがありますが、注意しないと、間違いなく間違った道をたどることができます。
CASE
重要なのは、それが単一の値を返す式であることを理解することです。多くの人は他の言語から来ており、それがフローの制御に使用できるステートメントであると想定しています。