top of page
  • Yazarın fotoÄŸrafıTuncay Tiryaki

DECODE vs CASE

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.

1.120 görüntüleme1 yorum

Son Yazılar

Hepsini Gör
bottom of page