ANASAYFA | BLOG | SORU CEVAP | REFERANSLARIM | DOWNLOAD | HAKKIMDA | İLETİŞİM | ARAMA
SQL CASE - WHEN - THEN İŞLEMLERİ | SQL ŞARTLI SELECT

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

  • Kolondaki veriye göre koşul belirtmek
  • Agregatee fonksiyonlar kullanılarak koşul belirtmek

FK-gizle

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.




Diğer Yazılarımdan Seçmeler...