2015-07-19 47 views
0

根據我的理解,DECODE函數用於檢查搜索表達式的條件並顯示結果。下面的例子有所謂的「SUM」一組函數使用DECODE函數:ORACLE中的DECODE函數中使用的參數

SELECT COUNT(*) "Total", 
     SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1995',1,0)) "1995", 
     SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1996',1,0)) "1996", 
     SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1997',1,0)) "1997", 
     SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1998',1,0)) "1998" 
FROM  employees; 

我想了解它是如何與「TO_CHAR」功能和「SUM」函數的函數。

  1. 在示例中使用的TO_CHAR函數轉換的日期數據類型的字符數據類型和值與搜索值(1995,1996,等)進行比較,並計算結果。
  2. 但是,SUM函數只能用於數字數據類型。

這裏有幾個問題:

問題1:能DECODE函數也需要有不同的數據類型的值?例如,如果1995年,1996年使用年代替代'1995','1996',則查詢成功執行。

問題2:參數「1」和「0」是數字,用在TO_CHAR函數中,它在組函數「SUM」中使用。當DECODE子句中的數據類型不同時它是如何執行的?

請幫忙。

回答

0

問題1:DECODE函數是否也採用具有不同數據類型的值?例如,如果1995年,1996年使用年代替代'1995','1996',則查詢成功執行。

不完全是,但它確實允許隱式轉換。 TO_CHAR正在生成一個字符串值,所以與字符串'1995'比較很好。如果第二個參數是數字1995,那麼TO_CHAR結果將被隱式轉換爲一個數字進行比較 - 這對於那個日期格式模型也是有效的,因爲年份是一個數字。

如果您有更多比較的解碼,那麼每個搜索表達式和結果值的數據類型需要匹配,但您只需在此處進行一次比較。並且SUM只能看到0或1.

問題2:參數「1」和「0」是數字,用於TO_CHAR函數中,並且在組函數「SUM」中使用。當DECODE子句中的數據類型不同時它是如何執行的?

1和0不是TO_CHAR函數的一部分,它們是DECODE的第3個和第4個參數。所以每個DECODE的結果都是0或1,而不管用於比較的前兩個參數的數據類型如何。 SUM沒有正在解碼的值或搜索表達式或其數據類型的可見性。

也許這將有助於打破嵌套調用了一點:

SUM(
    DECODE(
    TO_CHAR(hire_date,'YYYY'), -- gets a string like '1995' 
     '1995',     -- if the string is '1995' then 
     1,      -- then value is 1 
     0      -- else value is 0 
    )       -- end of decode, result is 0 or 1 
)        -- end of sum of 0/1 values 
+0

:謝謝你的時間來回答這個問題,這是非常有幫助的,並清除我的預訂。 –