DECODE vs CASE
- Tuncay Tiryaki
- 19 May 2020
- 2 dakikada okunur
Güncelleme tarihi: 19 May 2020
Decode ve Case arasındaki farklar!!!

Decode ve Case benzer işlemleri yapsa da Case'in yapabileceklerinin yanında Decode hiç dikkate bile alınmayabilir. Yani bu mücadelenin galibi baştan belli aslında!!!
Decode ya da Case, hangisi!!!
1) DECODE
Decode, bir kolon ya da ifadenin, verilen değerlerle karşılaştırmasını yapar ve yine verilen sonuçlardan birini döndürür. Aşağıdaki sorgu üzerinden giderek açıklarsak çok daha iyi olacak:
Pembe satır: Karşılaştırılacak olan kolondur. Bu kolonun (unvan) değerine bakılır
Karşılaştırma satırları 2' şerli yazılır. İlki değer, diğeri sonuçtur
Eğer ilgili değer için karşılaştırma yoksa else kısmına girer. Bu bölüm, en son kırmızı satırdır. Else kısmı yazılmak zorunda değildir. Eğer else yoksa ve ilgili değer bulunamamışsa bu fonksiyon null döner.
Mavi satır: Unvan değeri 'MÜHENDİS' ise maaşın %5 i hesaplanır
Yeşil satır: Unvan değeri 'UZMAN' ise maaşın %2 si hesaplanır
Kırmızı satır: Verilen değerlerden biri değilse maaşın %3 ü hesaplanır
select ad, soyad, unvan, maas,
decode
(
unvan,
'MÜHENDİS', maas*0.05,
'UZMAN', maas*0.02,
maas*0.03
) kesinti
from personel
Bu SQL'de görüldüğü üzere DECODE, bir değerin sadece eşitlik kontrolünü sağlayabilir. Diğer kontrollerin hiçbirine sahip değildir. Örneğin, büyük, küçük, listenin içinde-dışında, birden fazla kolon değerini karşılaştırma gibi birçok kontrolü yapamaz. Oracle, bu fonksiyondan desteğini çekmiştir. Bunun yerine çok daha güçlü olan CASE ifadesini getirmiştir.
2) CASE
Decode fonksiyonunun yaptıklarının yanında birçok ekstra özelliği vardır. IF-THEN-ELSE yapısını kullanarak bir yazılım geliştiriyor gibi geniş çaplı kontroller koyabilirsiniz. Bir örnek ile açıklayalım:
Aşağıda görüldüğü üzere case-end arası bir kolonun değerini oluşturmaktadır. <, >, between operatörleri kullanılabilmiş ve istenilen değer oluşturulabilmiştir.
select maas,
case
when maas < 2000 then 'Düşük Maaş'
when maas >= 2000 and maas <= 5000 then 'Orta Maaş'
when maas > 5000 then 'Yüksek Maaş'
end seviye
from personel
Başka bir örnek çözelim:
Birçok farklı alan üzerinde faklı operatörlerle (in, <, >, =) bir karşılaştırma yapılabiliyor
Sonuçta sot_turu isminde bir kolonun sayısal değeri oluşturuluyor. Değerler yeşil renkle gösterilmiştir
En altta bu şartlardan hiçbirinin geçerli olmadığı durumda üretilecek değer olan else kısmı yer almaktadır
nvl, substr gibi fonksiyonlar rahatlıkla kullanılabilmiştir
case
when abone_durum in (2,3) then 68
when hizmet_turu = '16' then 22
when abone_turu = '10451' then 34
when substr(abone_turu,1,1) in ('2','8') then 35
when nvl(sot_tarih_grubu,0) = 2 then 89
when abone_sayisi < 1000 then 45
else 60
end sot_turu
Sonuç olarak, yukarıdaki son örnekte de görüldüğü Case ifadesinin üstünlüğü ve kabiliyetleri, Decode fonksiyonu ile karşılaştırılamaz bile. Ama yine de basit karşılaştırmalar için decode fonksiyonunu rahatlıkla kullanabilirsiniz.
Comments