Sql Server iif Fonksiyonu ve Ternary If

Herkese merhaba, Sql Server yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda iif() fonksiyonu ve ternary if yazımından bahsedeceğim. Hadi başlayalım !
iif() fonksiyonu aslında bir fonksiyon olsa da ternary if görevi görüyor. Ternary if; tek satırlık if-else durumlarında kullanılmakta. C#, Python, Javascript gibi programlama dillerinde farklı bir şekilde kullanımı olsa da Sql Server’da iif() fonksiyonu ile ternary if yazılabiliyor.
Bu fonksiyon 3 tane parametre alıyor. Birinci parametre if şartını, ikinci parametre if şartının doğru (true) olması durumunda yapılacak işlemi, üçüncü parametre ise if şartının yanlış (false) olması durumunda yapılacak işlemi alıyor. Örneğin dışarıdan alınan bir sayının 5’ten büyük olup olmamasına göre geriye dönüş yaptıralım;
declare @sayi int;
select iif(@sayi < 5, 'Sayı 5ten Küçüktür', 'Sayı 5ten Büyüktür');
Bu sorguda iif() fonksiyonu içerisinde önce @sayi değişkeninin 5’ten küçük olup olmamasına bakılır, 5’ten küçükse iif() fonksiyonu geriye Sayı 5ten küçüktür ifadesini döndürür, @sayi değişkeni değeri 5’ten büyükse de Sayı 5ten büyüktür ifadesini döndürür. Zaten ternary if’te bu işlemi yapıyor.
iif() fonksiyonunun tek yapabildiği bu değil. Doğrudan tablolar üzerinde de iif() fonksiyonu ile ternary if kullanılabiliyor. Mesela select sorgusunda sütundaki verinin değerine göre getirmek istediğiniz sütunu değiştirebiliyorsunuz. Örneğin int tipinde id, varchar tipinde kitapAdi, int tipinde sayfaSayisi ve int tipinde basimYili sütunları olan kitaplar adında bir tablo olduğunu varsayalım. Bu tabloda birkaç sorgu çalıştıralım;
select iif(id > 10, sayfaSayisi, basimYili), kitapAdi from kitaplar;
select * from kitaplar where iif(basimYili > 2000, basimYili, sayfaSayisi) > 100;
İlk sorgu kitaplar tablosundan kitapAdi sütununun yanında id değeri 10’dan büyükse sayfaSayisi, küçük yada eşitse de basimYili sütununu getirecektir. İkinci sorgu basimYili 2000’den büyükse basimYili, küçük yada eşitse de sayfaSayisi değeri 100’den büyük olan tüm verileri getirecektir. Bu sorgular doğrudan yapılan sorgular fakat bir tane stored procedure yazalım ve bu procedure kitaplar tablosuna veri yazsın. Fakat basimYili değeri 2023’ten büyük gelirse 2023 olarak kabul etsin. Ayrıca sayfaSayisi değeri int veritipinin taşıyabileceği maksimum sayıdan (2147483647) büyükse de maksimum değeri kabul etsin. Bu değişimleri iif() fonksiyonu ile yapalım.
create procedure yeniKitapEkle @sayfaSayisi int, @basimYili int, @kitapAdi varchar(100) as
set @sayfaSayisi = iif(@sayfaSayisi > 2147483647, 2147483647, @sayfaSayisi)
set @basimYili = iif(@basimYili > 2023, 2023, @basimYili)
insert into kitaplar(sayfaSayisi, basimYili, kitapAdi) values(@sayfaSayisi, @basimYili, @kitapAdi)
Burada yaptığımız işlemlere bakacak olursak; dışarıdan int tipinde @sayfaSayisi, int tipinde @basimYili ve varchar tipinde @kitapAdi değişkenlerini aldık. Procedure içerisinde önce @sayfaSayisi değerininin 2147483647’den büyük olup olmamasına baktık. Büyükse @sayfaSayisi değişkeninin değerini 2147483647 olarak güncelledik, büyük değilse de dışarıdan gelen değeri kabul etmesini söyledik. @basimYili parametresininde 2023’ten büyük olup olmadığını kontrol ettik. Büyükse @basimYili değerini 2023, büyük değilse de dışarıdan gelen değeri kabul et dedik. Son olarakta kitaplar tablosuna bu verileri ekledik. Yazdığımız stored procedureyi (100, 2025, ‘Sefiller’) parametreleri ile çağırdığınızda basimYili sütununun 2023 olarak yazıldığını göreceksiniz. Aynı şekilde (2147483647, 2000, ‘Sefiller’) şeklinde çağırdığınızda sayfaSayisi sütununun 2147483647 olarak yazıldığını göreceksiniz.
iif() fonksiyonunda dikkat etmemiz gereken tek nokta şu; ikinci ve üçüncü parametrelerin veritipi aynı olmak zorunda. Birinci parametre zaten her zaman boolean döndürecek fakat ikinci ve üçüncü parametrelerin veritipleri aynı olmalı. Örneğin az önce yazdığımız stored procedurede set @sayfaSayisi = iif(@sayfaSayisi > 2147483647, 2147483647, @sayfaSayisi) satırında iki ve üçüncü parametreler int tipinde, ondan önceki örnekte yani select * from kitaplar where iif(basimYili > 2000, basimYili, sayfaSayisi) > 100; satırında da iki ve üçüncü parametreler int tipinde. Tabiki int tipinde olmak zorunda değil, veritipleri aynı olduğu sürece hangi tipte olduklarının önemi yok. Örneğin ilk örnekte yani select iif(@sayi < 5, ‘Sayı 5ten Küçüktür’, ‘Sayı 5ten Büyüktür’); satırında iki ve üçüncü parametreler varchar tipinde, yani aynı tipteler. Sizinde buna dikkat etmesi gerekiyor, farklı tiplerde verdiğiniz iki ve üçüncü parametreler hata verdirecektir.
Evet Sql Server’da iif() fonksiyonu ve ternary if kullanımı bu şekilde yapılmakta. Tüm Sql Server yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.