Case statement t-sql’de bir sorgu sonucu dönen bir kolonun değerine göre farklı işlemler yapabilmemizi sağlar. Mantık olarak programlama dillerindeki switch/case ifadesinden bir farkı yoktur. Basit bir örnekle açıklayacak olursak bir çalışan tablomuz olsun ve çalışan tablomuzun ID, isim ve maaş attributeları olsun. Yazdığımız basit bir sorguda maaş yerine belli bir miktarı açlık sınırı olarak belirleyip bu miktar altında kalanları açlık sınırı altı, bu miktara eşit olanları açlık sınırı ve üstünde maaş alan kisileri ise açlık sınırı üstü olarak nitelendirmek istiyoruz bu noktada Case statement kullanabiliriz. Yazılanlardan yola çıkarak basit bir örnek yapalım.
--Tablomuzu değişken olarak tanımlayıp dolduruyoruz DECLARE @Calisan TABLE ( ID int, isim varchar(15), maas decimal(8,2) ); INSERT @Calisan VALUES (1,'Rıfkı',1500), (2,'Refik',2500), (3,'Kamil',2700), (4,'Fadime',2500), (5,'Faik',1000), (6,'Sıdıka',1200), (7,'Mecnun',900), (8,'Hande',2000), (9,'Seval',90000), (10,'Pınar',1250), (11,'Onur',3400);
Açlık sınırımız 2500 lira olsun ve bu sınıra göre bize kişinin açlık sınırında veya bu sınırın altında yada üstünde olduğunu söyleyecek bir select sorgusu yazalım.
SELECT ID, isim, CASE WHEN maas < 2500 THEN 'Aclik siniri altinda' WHEN maas = 2500 THEN 'Aclik sinirinda' WHEN maas > 2500 THEN 'Aclik siniri ustunde' END sinir_bilgisi --isimlendirdigimiz kisim FROM @Calisan;
ID | isim | sinir_bilgisi |
1 | Rıfkı | Aclik siniri altinda |
2 | Refik | Aclik sinirinda |
3 | Kamil | Aclik siniri ustunde |
4 | Fadime | Aclik sinirinda |
5 | Faik | Aclik siniri altinda |
6 | Sıdıka | Aclik siniri altinda |
7 | Mecnun | Aclik siniri altinda |
8 | Hande | Aclik siniri altinda |
9 | Seval | Aclik siniri ustunde |
10 | Pınar | Aclik siniri altinda |
11 | Onur | Aclik siniri ustunde |
Yazdığımız sorgunun sonucunda kişilerin açlık sınırı bilgisini elde ettik. Ve bu sorguyu aşağıdaki gibi de yazabiliriz.
SELECT ID, isim, CASE WHEN maas < 2500 THEN 'Aclik siniri altinda' WHEN maas = 2500 THEN 'Aclik sinirinda' ELSE 'Aclik siniri ustunde' END sinir_bilgisi FROM @Calisan;
Birde ortalama maaş üzerinden hesaplama yapalım. AVG fonksiyonunu group by olmadan burada kullanamadığımızdan ortalama maaş değerini bir değişkene alıyoruz. Ve bu ortalama değeri karşılaştırmalarda kullanıyoruz.
DECLARE @Ortalama_maas decimal(8,2); SELECT @Ortalama_maas = AVG(maas) FROM @Calisan; SELECT ID, isim, CASE WHEN maas < @Ortalama_maas THEN 'Ortalama altinda' WHEN maas > @Ortalama_maas THEN 'Ortalama ustunde' ELSE 'ortalama' END sinir_bilgisi FROM @Calisan;
Sonuç aşağıdaki gibi olmaktadır.
ID | isim | Ortalama bilgisi |
1 | Rıfkı | Ortalama altinda |
2 | Refik | Ortalama altinda |
3 | Kamil | Ortalama altinda |
4 | Fadime | Ortalama altinda |
5 | Faik | Ortalama altinda |
6 | Sıdıka | Ortalama altinda |
7 | Mecnun | Ortalama altinda |
8 | Hande | Ortalama altinda |
9 | Seval | Ortalama altinda |
10 | Pınar | Ortalama altinda |
11 | Onur | Ortalama altinda |