2014-01-29 52 views
1

我不太理解這個DECODE函數將如何自行解決,特別是在尖(==>)參數:DECODE在ORACLE

DECODE 
(
    SH.RESPCODE, 0, SH.AMOUNT-DEVICE_FEE, 
    102, SH.NEW_AMOUNT-DEVICE_FEE, 
    ==>AMOUNT-DEVICE_FEE, 
    0 
) 

預先感謝什麼該參數將解決任何啓示至。

回答

2

在僞代碼,這將是等效於下面的IF語句

IF(sh.respcode = 0) 
THEN 
    RETURN sh.amount-device_fee 
ELSIF(sh.respcode = 102) 
THEN 
    RETURN sh.new_amount-device_fee 
ELSIF(sh.respcode = amount-device_fee) 
THEN 
    RETURN 0; 
END IF; 
1

DECODE基本上相當於CASE表達式。

所以這

DECODE 
(
    SH.RESPCODE, 0, SH.AMOUNT-DEVICE_FEE, 
    102, SH.NEW_AMOUNT-DEVICE_FEE, 
    ==>AMOUNT-DEVICE_FEE, 
    0 
) 

相當於該

CASE SH.RESPCODE 
    WHEN 0 THEN SH.AMOUNT - DEVICE_FEE 
    WHEN 102 THEN SH.NEW_AMOUNT - DEVICE_FEE 
    WHEN AMOUNT - DEVICE_FEE THEN 0 
END 
+0

是的。換句話說,如果'SH.RESPCODE'等於'(AMOUNT - DEVICE_FEE)',那麼表達式將返回'0'。 – rsenna

+0

當然,除非之前的WHEN條款是真實的。它們按順序進行評估,就像'DECODE'調用一樣。 – rsenna

3

它說:

If the value of SH.RESPCODE is 0, then return SH.AMOUNT-DEVICE_FEE. 
Otherwise, if it's equal to 102, then return SH.NEW_AMOUNT-DEVICE_FEE. 
Otherwise, if it's equal to AMOUNT-DEVICE_FEE, then return 0 

作爲一個case語句將是:

Case SH.RESPCODE 
    when 0     then SH.AMOUNT-DEVICE_FEE 
    when 102    then rSH.NEW_AMOUNT-DEVICE_FEE 
    when AMOUNT-DEVICE_FEE then 0 
    else null 
end 

有關於兩者之間的待遇NULL的一些細微的差別。

0

關於DECODE相當於CASE的意見很好。有一件事我發現是有幫助的就是格式化DECODE調用,使其更具可讀性,如:

DECODE(SH.RESPCODE, 
     0,     SH.AMOUNT-DEVICE_FEE, 
     102,    SH.NEW_AMOUNT-DEVICE_FEE, 
     AMOUNT-DEVICE_FEE, 0) 

分享和享受。

+0

是的,這是我的混亂,因爲代碼缺乏格式化的一部分,所以我最終假設最後的值是默認值。 – mimabe