我認爲這是一個更簡單的表達了相同的查詢方式:
Total = CASE Payment.ID
WHEN 1 THEN myTable.Total
WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0)
ELSE 0
END,
我們只有真正需要的一個條件爲Payment.ID
= 4,因爲只有兩種可能的結果(我們要麼要減去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,
但在這種情況下,你在裏面有重複的很多,和你提到一個表達三次。在某些情況下,這可能會對性能造成不利影響(想象一下,如果該表達式計算起來很昂貴,例如子查詢或UDF調用,並且查詢邏輯導致它不止一次計算)。有時候引擎會做引擎要做的事情,不管你試圖超越它,但是如果你不小心的話,你肯定會把它引向錯誤的道路。
關鍵是瞭解CASE
是一個返回單個值的表達式。許多人來自其他語言,並且認爲這是一種可用於控制流量的聲明。
我實際上在這裏看不到任何使用的變量,標題錯誤或者是否遺漏或更改了一些代碼? – 2012-04-29 05:24:06
不,我認爲有人爲我改變它... – user710502 2012-04-29 06:03:09
我改變了..不知道是誰改變它說我正在使用「變量」 – user710502 2012-04-29 06:05:46