2010-07-07 29 views
28

參照以前的question,我想知道如果它總是能夠通過CASE更換DECODE,哪一個是獲得更好的性能?CASE與DECODE

+5

我只是用Google搜索「甲骨文案VS解碼」,發現了很多環節。基本上情況是更好的可讀性,更靈活,更標準 – Rene 2010-07-07 10:01:45

回答

42

一如既往地與甲骨文... ... AskTom

從這個post ...

解碼是有點模糊 - CASE是 非常非常清楚。 容易做的解碼很容易做在 CASE,難以或接近 難以解碼的事情很容易 在CASE做。 CASE,邏輯明智,贏得 手。

從性能的角度來看,它們似乎差不多,上面的文章提到了一些速度差異,但沒有對特定語句進行基準測試,這很難說。

+1

另一點來自同一篇文章:「解碼是Oracle在8.1.6之前提供的數據庫版本的功能 從816開始,CASE是實現相同的結果「 - 因此,當使用舊版本的Oracle時,CASE可能不可用。 – 2010-07-07 10:11:51

+1

8.1.6很老,我覺得8.1.6的日期從1999年開始。 – TTT 2010-07-07 13:42:50

+0

謝謝@TTT,這很有趣。我剛被僱用將Cognos 7報告轉換爲Cognos 10 :)。現在看看將DECODE語句切換到CASE。 – 2017-01-27 20:52:08

42

DECODECASE之間有一個很大的區別,它與如何比較NULLs有關。如果將NULLNULL進行比較,則DECODE將返回「true」。 CASE不會。例如:

DECODE(NULL, NULL, 1, 0) 

將返回'1'。

CASE NULL 
    WHEN NULL THEN 1 
    ELSE 0 
END 

將返回'0'。你將不得不把它寫成:

CASE 
    WHEN NULL IS NULL THEN 1 
    ELSE 0 
END 
+0

我認爲這是一個非常重要的區別。我剛剛閱讀了解碼,試圖用大小寫替換它,並想知道爲什麼當列值爲null時我看不到相同的結果。感謝澄清這一點! – prabhu 2014-11-25 10:15:10

0
select (DECODE(NULL, NULL, 1, 0)) from dual; 

select (CASE 
    WHEN NULL IS NULL THEN 1 
    ELSE 0 

END 
) 
from dual; 

都返回1

+0

什麼都沒有被Cheran回答。 – ceving 2017-01-02 09:39:10

3

CASE是一個語句和解碼是一個功能 我們可以使用CASE在where子句中,不能使用DECODE在where子句中。 DECODE只能在CASE可以支持所有關係運算符的情況下檢查相等運算符 DECODE只能在sql中使用,因爲CASE可以在SQL和PL/SQL中使用 CASE比DECODE更好。

你可以找到更多:http://www.oracleinformation.com/p/sql-tutorial.html

+2

-1代表「...並且不能在where子句中使用DECODE。「DECODE是一個函數,每個函數都有一個返回值,您可以使用該返回值來檢查其他值: DECODE(tbl.field,SearchList,SomeConstOrAField,默認)NOT IN(其他列表) 或 解碼(tbl.field,SearchList,SomeConstOrAField,默認)=東西 等 – 2017-05-16 06:53:29