我认为这是表达相同查询的一种更简单的方法:
Total = CASE Payment.ID
WHEN 1 THEN myTable.Total
WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0)
ELSE 0
END,
我们只需要一个 for Payment.ID
= 4 的条件,因为只有两种可能的结果(我们要么减,要么不减trans.Amount
,我们可以使用COALESCE
(or 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,
但在这种情况下,你有很多重复,你提到一个表达三遍。在某些情况下,这可能会损害性能(想象一下,如果该表达式的计算成本很高,例如子查询或 UDF 调用,并且查询逻辑导致它被计算多次)。有时引擎会做引擎会做的事情,不管你多么想超越它,但如果你不小心,你肯定会把它引向错误的道路。
关键是要理解这CASE
是一个返回单个值的表达式。许多人来自其他语言并认为它是一个可用于控制流的语句。