Adem KALIN – Yazılım Mühendisi

Oracle DECODE Fonksiyonu ve Sağladığı Kolaylıklar, Switch-Case ‘den Farkı

wpid-OracleDecode.jpg

Kısa bir yazı ile Oracle’da beğendiğim çok kullanışlı bir fonksiyon, DECODE fonksiyonundan bahsetmek istiyorum. Öncelikle SQL Server geçmişinden gelen biri olarak şunu söylemeliyim, bu fonksiyonun SQL Server’da tam bir karşılığı bulunmuyor. (Oracleve SQL Server arasındaki farkları yazdığım Farklar – 1 ve Farklar – 2 yazılarımı okumanızı tavsiye ederim) Belki yerine kullanılabilecek (Oracle’ın da desteklediği) switch-case yapısından bahsedebiliriz fakat yine de tam karşılığı olmayacaktır.

DECODE fonksiyonu, parametre sayısı olarak kısıtlanmamış bir karar fonksiyonudur diyebiliriz. İlk parametresinden okunan değerin olası karşılıklarına göre hangi çıktıyı vermek istediğimizi kendimiz yönetebiliyoruz. Gerçek hayattan bir örnek ile konuyu netleştirmek istiyorum. Sabiha Gökçen Havaalanına gittiniz ve içeride bir yolcunuzu karşılamak üzere gerekli perona ulaşmak istiyorsunuz. Havaalanı kampüsü içerisinde gördüğünüz tabelalar size “Nereye gitmek istiyorsun?” diye soruyorlar ve sizden aldıkları cevaba göre size bir yön gösterimi yapıyor.

wpid-storageemulated0DownloadYönTabelası.jpg.jpg

Aynen bunun gibi de Decode fonksiyonu ile, Veritabanından okuyacağınız bir değer karşılığında vermek istediğiniz çıktıyı hazırlayabiliyorsunuz.  Aşağıdaki scripti incelediğinizde biraz daha oturacaktır bilgi kafanızda.

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
  var1 VARCHAR2(2);
BEGIN
  --var1 değerine atama yapabilirsiniz!
  SELECT
     DECODE (var1,                        --okunacak değer
             'A', 'A değeri okundu',      --Değer 'A' olarak okunduğunda verilecek çıktı
             'B', 'B değeri okundu',      --Değer 'B' olarak okunduğunda verilecek çıktı
             'C', 'E değeri okundu',      --Değer 'C' olarak okunduğunda verilecek çıktı
             'Defualt bir değer okundu')  --Bunların dışında okunduunda verilecek çıktı
     FROM DUAL;
END;

Örnekte göreceğiniz gibi, okunan değer ve bu değer karşılığında verilecek çıktılar 2 li parametre çiftleri halinde ekleniyor. En sonda da eğer default bir değer eklemek istiyorsanız, tek bir parametre olarak bu çıktı değerini ekliyorsunuz.  Dolayısı ile ilk parametre okunacak değer, ondan sonra gelen her ikili parametre çifti çıktı için seçenekleri ve en sondaki tek parametre de default çıktıyı temsil etmektedir. E bunları her yerde bulabiliriz niye kendini bu kadar yoruyorsun der gibisiniz 🙂 Ben hem biraz daha akılda kalıcı bir şekilde anlatmak hem de bunu ne şekilde kullanarak avantajlı hale getirebiliriz kısmını açıklamak istiyorum.

DECODE kullanımının switch-case yapısından en görünen farkı, kullanım kolaylığıdır diyebilirim. Fakat basit seçim ifadeleri için bu durum böyle. Aksi halde karmaşık ifadeler için swich-case yapısının daha geniş imkanlara sahip olduğunu düşünüyorum, daha kompleks mantıkları daha anlaşılabilir bir formda sunabilirsiniz switch-case yapısı içerisinde.

İkinci bir avantajı ise bir group by sırasında ortaya çıkıyor. Okuduğunuz bir değere göre artan yada azalan bir sıralamada çok daha karmaşık bir sıralama yapma ihtiyacınız olabilir. Bu noktada DECODE fonksiyonu devreye girerek size büyük bir kolaylık sağlayabiliyor. Bir örnek ile bunu da açıklayalım. Çalışan kayıtlarının tutulduğu tablodan sıralı bir liste çekmek istiyorsunuz. Fakat bu sıralamada bazı isimlerin listede öncelikli olarak gelmesini, diğerlerinin ise isim sırasına göre gelmesini istiyorsunuz. Bu durumda aşağıdaki script size bu imkanı sağlayacak ve sizin işinizi çok kolaylaştıracaktır.

1
2
3
4
SELECT e.*
  FROM employees e
 ORDER BY DECODE(e.name, 'Hakan', 1 'Şakir', 2 'Demir', 3, 99),
          e.name;

Bu örnekte çalışanlardan ismi Hakan, Şakir ve Demir bu sırayla en üstte gelecek, diğer çalışanlar ise isim sırasında geleceklerdir.  Örnek belki çok basit fakat daha karmaşık mantıkları işletmek de size ve hayal gücünüze kalıyor 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir