考慮下面的查詢,並注意CALCULATE_INCENTIVE功能:有人可以幫我弄清Oracle的(10g)AND/OR短路嗎?
SELECT EMP.* FROM EMPLOYEES EMPS
WHERE
EMP.STATUS = 1 AND
EMP.HIRE_DATE > TO_DATE('1/1/2010') AND
EMP.FIRST_NAME = 'JOHN' AND
CALCULATE_INCENTIVE(EMP.ID) > 1000
ORDER BY EMPS.ID DESC;
我是Oracle使用該.NET使用在其和/或邏輯的相同(或相似)的短電路的印象。例如,如果EMP.STATUS = 2,它將不會打擾評估表達式的其餘部分,因爲整個表達式無論如何都會返回false。
對我來說,CALCULATE_INCENTIVE函數在db中的每個員工上都被調用,而不是僅在前三個WHERE表達式返回的9條記錄上調用。我甚至試圖圍繞我想組合在一起進行短路評估的特定表達式進行括號試驗,但我無法弄清楚。
任何人有任何想法如何獲得CALCULATE_INCENTIVE 而不是評估如果任何以前的表達式返回false?
有趣的是,你提出這個答案,因爲這是我在昨天剛問過的問題中給予我的解決方案,並且是我採取的最終路線。我知道Oracle支持短路評估,但我有興趣弄清楚它是如何實現的。 – oscilatingcretin
@oscilatingcretin:那個解決方案在我心中是新鮮的,因爲我最近寫了它。對不起,我沒有意識到OP是一樣的。不過,這是唯一的(據我所知)迫使Oracle以特定的方式對評估進行短路。正如@Justin Cave指出的那樣,甲骨文將短路條件,但它基於優化器的路徑而不是查詢的語法。 – Allan