SQL de şart belirterek, seçim yaparak SELECT sorgusu yapmak için Case-When yapısını kullanırız. Mantık olarak bütün programlama dillerinden aşina olduğumuz IF-ELSE yapısına benzer ama SQL de koşul belirtirken if-else değilde when-else şeklinde kullanırız. Bu işlemleri SQL tarafında yapmak bize performas açısından avantaj sağlar. Aynı işlemleri programlama tarafında kendi programımızda arkaplanda da yapabiliriz ama bu durum programımızın yavaşlamasına neden olacaktır. Eğer veriniz az ise ilk başlarda bu performans kaybı gözle görülmeyecek düzeydedir. Fakat zaman içerisinde artan verilere karşın programınız günden güne performanstan düşecektir. Hemde bu işlemleri SQL tarafında yapmak oldukça pratik ve kolaydır. Programlama tarafında yapmak için SQL e oranla çok daha fazla satır kod yazmak zorunda kalabilirsiniz.
Select when case yapısını iki ana başlık altında inceleyeceğiz
1-KOLON KULLANARAK ŞART BELİRTMEK
Bazen kolonda tuttuğumuz veri ile kullanıcının görmesini istediğimiz veri birbiriyle uyuşmaz. Mesela sınav sonuçları için bool/bit veri tipinde True/False olarak kayıt işlediniz. Ama öğrencilerinize mail atarken sınav geçme durumunu Geçtiniz/Kaldınız şeklinde göstermek istiyorsunuz. Yada Kızları ‘K’, Erkekleri ise ‘K’ şeklinde kaydediyorsunuz ama baktığınızda Kız/Erkek olarak görmek istiyorsunuz. Bu gibi durumlarda case-when yapısını kullanıyoruz. Genel hatlarıyla nasıl kullanıldığını inceleyecek olursak;
SELECT KolonBaslık=
CASE SecilenKolon
WHEN şart1 THEN yapılacaklar
WHEN şart2 THEN yapılacaklar
…
ELSE yapılacaklar
END,
tablodanSecilecekDigerKolonlar
FROM TabloAdı
Şimdi örneklerle kodumuzun nasıl çalıştığına bakalım. İlk olarak Kızların K, Erkeklerin ise E olarak kaydedildiği sistemden verileri çekerken K/E yerine KIZ/ERKEK yazmasını sağlayalım
Tablomuz şuan şu şekilde;
id | ad | soyad | cinsiyet | gectimi |
---|---|---|---|---|
1 | Osman | ÜNAL | E | |
2 | Ayşe | CANBAZ | K | |
3 | Eyup | HIZIR | E | |
4 | Halil | ADEM | E | |
5 | Aliye | KARADERE | ||
6 | Emine | YUCEL | K | |
7 | Hacer | CUGEN | K | |
8 | Yunus | EMRE |
Şimdi K/E yazan yerlere KIZ/ERKEK yazdırma işlemi yapacağız,
CinsiyeT =case cinsiyet --> cinsiyet kolonunun üzerinde şart belirteceğiz
when 'E' then 'ERKEK' --> E olanları ERKEK yap
when 'K' then 'KIZ' --> K olanları KIZ yap
else --> eğer E ve K değilse
'Cinsiyet Girilmemiş' --> Girimemiş yap
end
Şimdi bunu koda uygulayıp tablomuzu tekrar çekelim
SELECT id,ad,soyad,
CinsiyeT =case cinsiyet when 'E' then 'ERKEK'
when 'K' then 'KIZ'
else
'Cinsiyet Girilmemiş'
end
,gectimi
FROM tbOgrenciler
id | ad | soyad | CinsiyeT | gectimi |
---|---|---|---|---|
1 | Osman | ÜNAL | ERKEK | |
2 | Ayşe | CANBAZ | KIZ | |
3 | Eyup | HIZIR | ERKEK | |
4 | Halil | ADEM | ERKEK | |
5 | Aliye | KARADERE | Cinsiyet Girilmemiş | |
6 | Emine | YUCEL | KIZ | |
7 | Hacer | CUGEN | KIZ | |
8 | Yunus | EMRE | Cinsiyet Girilmemiş |
Gördüğünüz gibi değerler değişerek çekildi. Şimdi aynı tablodaki gectimi kolonunu da değiştirelim, Yine aynı şekilde yapacağız
GectiMi =case gectimi --> gectimi kolonunun üzerinde şart belirteceğiz
when '1' then 'GECTI' --> 1(True) olanları GECTI yap
when '0' then 'KALDI' --> 0(False) olanları KALDI yap
else --> eğer 1 veya 0 değilse
'SINAVA GIRMEDI' --> SINAVA GIRMEDI yap
End
Şimdi bunu da sorgumuza ilave edip tekrar çalıştıralım, Kodumuzun şuanki hali;
SELECT id,ad,soyad,
CinsiyeT =case cinsiyet when 'E' then 'ERKEK'
when 'K' then 'KIZ'
else
'Cinsiyet Girilmemiş'
end
,GectiMi =case gectimi when '1' then 'GECTI'
when '0' then 'KALDI'
else
'SINAVA GIRMEDI'
end
FROM tbOgrenciler
id | ad | soyad | CinsiyeT | GectiMi |
---|---|---|---|---|
1 | Osman | ÜNAL | ERKEK | GECTI |
2 | Ayşe | CANBAZ | KIZ | KALDI |
3 | Eyup | HIZIR | ERKEK | KALDI |
4 | Halil | ADEM | ERKEK | GECTI |
5 | Aliye | KARADERE | Cinsiyet Girilmemiş | KALDI |
6 | Emine | YUCEL | KIZ | GECTI |
7 | Hacer | CUGEN | KIZ | KALDI |
8 | Yunus | EMRE | Cinsiyet Girilmemiş | GECTI |
ELSE kullanmak zorunda değiliz ama NULL olan değerleri yada koşulda belirtmediğimiz değerleri kapsamak için ELSE yapısını kullandık, Siz yazdığınız kodda dilerseniz kullanmayadabilirsiniz. Else kullanımı veriye görede değişmektedir. Bazı durumlarda olabilecek durumlar belirlidir, bazı durumlarda ise yazamayacağımız kadar durum olabilir yada bu durumlar dinamik olarak değişiyor da olabilir, böyle durumlarda ELSE kullanmak bize kolaylık sağlayacaktır. Yukarıdaki tablodan else 'SINAVA GIRMEDI' kısmını çıkarsak da aynı sonucu alırız ama bu durum herzaman geçerli değildir. O yüzden ELSE komutunu da kullanmanızı öneriyorum.
2-AGREGATEE FONKSİYONLARDA ŞART BELİRTMEK
Agregatee fonksiyonlarda kullanılan fonksiyon içerisinde de şart belirtmemiz mümkün. Örneğin SUM() fonksiyonunu kullanacağımızı varsayalım. Eğer şöyleyse şununla topla, yok böylese bununla topla şeklinde koşul belirtebiliriz. Mesela bir işyerinin muhasebesini tutuyor olalım. Çalışanların ay içerisinde muhasebeden aldıkları parayı veritabanına işleyeceğiz. 3 farklı şekilde ay içerisinde para alma durumları olsun, bunlar sıra ile;
1-avans çekilen para
2-yaptıkları satıştan aldıkları pirim
3-bahsiş gelirleri
Şeklinde olsun, Şuan veritabanımızı inceleyecek olursak şu şekilde bir tablo ile karşılaşacağız.
id | ad | soyad | tip | miktar |
---|---|---|---|---|
1 | Osman | ÜNAL | 1 | 100 |
2 | Halil | ADEMOĞLU | 1 | 150 |
3 | Yunus | Aktaş | 2 | 250 |
4 | Halil | ADEMOĞLU | 3 | 30 |
5 | Osman | ÜNAL | 3 | 50 |
6 | Yunus | Aktaş | 1 | 300 |
7 | Halil | ADEMOĞLU | 3 | 70 |
8 | Halil | ADEMOĞLU | 2 | 250 |
9 | Osman | ÜNAL | 2 | 300 |
10 | Yunus | AKTAŞ | 1 | 100 |
Çalışanların aldıkları paraları gruplayarak hesaplamak istersek SUM() fonksiyonu ile CASE WHEN THEN kısıtlamaları kullanarak herkesin nerden ne kadar aldığını hesaplayabiliriz. Bu sefer koşul ifadesini agregatee fonksiyonun içerisine yazacağız.
select ad,soyad
,SUM(case when tip='1' then miktar else 0 end) as Avans
,SUM(case when tip='2' then miktar else 0 end) as Prim
,SUM(case when tip='3' then miktar else 0 end) as Bahsis
from tbCalisanlar group by ad,soyad
Yukarıdaki örnekten herhangi bir SUM() işlemini inceleyecek olursak, eğer tipi şöyle ise miktar kolonuyla topla, eğer tip şarta uymuyorsa burayı 0 olarak al, ve her SUM() koonuna da alias ile isim belirterek hangi kolonun neyi ifade ettiğini belirtmiş olduk. Bu sorgunun sonucunda gelen tablo ise şu şekilde olacaktır.
ad | soyad | Avans | Prim | Bahsis |
---|---|---|---|---|
Halil | ADEMOĞLU | 150 | 250 | 100 |
Yunus | Aktaş | 400 | 250 | 0 |
Osman | ÜNAL | 100 | 300 | 50 |
Gördüğünüz gibi kişiye göre muhasebeden çıkan paranın ne için çıktığını, kimin ne için ne kadar aldığını kolaylıkla hesaplamış olduk.