Önce bu işlemimizi sağlayacağımız fonksiyonumuzu tanıyalım
COALESCE: fonksiyonunun aldığı değer dizi tipi
gibidir. Yani aralarına virgül koymak kaydıyla birçok değer yazabilirsiniz.
Örn: COALESCE(Kod, @Kod, @Set, @Ad , ‘aba’ ) gibi.
Bu fonksiyon; verilen değerlerden İLK NULL OLMAYAN değeri
geri döndürür. Bu özellikten yararlanarak tam esnek where cümlecikleri yazacağız.
Konuyu örnek bir prosedür ile açıklayalım.

Bu prosedür, parametrede verilen
fatura koduna ait faturayı getirir. Ve parametreyi kullanmak zorundasınızdır. Bu
parametreyi boş verirseniz de hiç fatura kaydı gelmez.
“ Exec Sp_FaturaGetir ‘1020155’ ” gibi bir kodla da
sadece bu faturayı getireceği aşikârdır.
Ama biz şunu yapmak istiyoruz. Eğer fatura parametresi vermezsek
tüm faturaları getirsin, yok eğer verirsek de sadece o faturayı getirsin.
Bunun için prosedürümüzün aldığı
parametreye default değer yani ilk değer olarak null vermeliyiz ki parametreyi
kullanmadan da prosedürü çalıştırabilelim. Yoksa hata alırız. Ben parametreye default
null parametresini aşağıda ki gibi değeri verdirdim.

Şu an parametre vermeden de bu prosedürü çalıştırabiliriz.
“ Exe Sp_FaturaGetir ”. Parametre kullanmadığımız için
default değer olarak belirlediğimiz null değerini alacak dolayısıyla da fatura
numarası null olan kayıtlar gelecektir.(böyle bir kayıtta olmamalı zaten)
Prosedürümüze son şeklini veriyoruz. Artık fonksiyonumuzu
prosedürümüzde kullanabiliriz.

Ben; üstte de görüldüğü üzere COALESCE
fonksiyonuna parametre olarak önce parametreden gelen değeri atadım.
Dolayısıyla bu değer öncelikli olacak. Ama bu değer null gelirse ikinci değer
olarak da tablonun o kolonunu verdim. Bu sayede @FaturaNo parametresi
null ise değer parametreye geçecek. O da kolonun kendisi olduğu için kolon
kendisi kendisine eşitlenecek ve dolayısıyla şart elimine edilmiş olacak. Yani
eğer parametreye değer verirsek o değere ait kayıtlar gelecek. Yok, eğer
parametreye değer vermezsek o şart elimine olacağından tüm kayıtlar gelecek. Bu
sayede birden çok kolonda da COALESCE fonksiyonunu kullanım daha karmaşık
sorgular yazabilirsiniz.
Tabi bu arada SQL deki null problemi de karşımıza
çıkabilir. Şöyle ki:
Select * from tablo where kod = null böyle bir
eşitlik çalışmamaktadır. Yani siz bir kolonun değerini
Kod = null diyerek null olanları getiremezsiniz. SQL
Server böyle bir kullanımı desteklememektedir.
Ancak bunun yerine şu fonksiyonu kullanabilirsiniz.
Select * from tablo where kod is null. Bu şekilde bir
kolonun değerini null ile sorgulayabiliriz.
Biz yukarıda COALESCE
fonksiyonumuzun temel prensibi olarak şunu söyledik.
COALESCE fonksiyonu; verilen değerlerden İLK NULL OLMAYAN
değeri geri döndürür
Peki, tüm değerler null ise. Yani parametreden null geliyor
ve tablonun o kolonundaki değeri de null ise COALESCE fonksiyonu o zaman
bize ne döndürecek. Tabii ki Null döndürecek. Zaten kolon değeri null olduğu
için eşitliğin her iki tarafı da null olacak ve Null = Null gibi bir durum ortaya
çıkacak. SQL Server iki null eşitliğini yapamadığı için de null değerler sorgu
sonucundan gelmeyecek.
Verilerimizde null olduğunu biliyorsak ve COALESCE
fonksiyonunun da gücünü kullanmak istiyorsak o zaman isnull fonksiyonunu burada
kullanabiliriz. Bu sayede SQL Serverın null zaafiyetinide aşmış oluruz. Bu son
durumda örnek kod aşağıdaki gibi olmalıdır.

Bu şekilde eğer null ise
boş bir değerle her iki tarafı da birbirine eşitleyip sorgumuzu Null’a
duyarlı hale getirebiliriz. Üstede dediğim gibi bu SQL’in bir zafiyetinden
kaynaklanıyor. SQL Server Null = Null kontrolünü yapamadığı için Select
cümlesinden dönemiyordu ama biz sorgumuzu Null’a duyarlı hale getirdik.
Bunu null problemini şöyle bir
örnekle daha iyi anlayabiliriz. Normalde sysobjects tablosunda yüzlerce
kayıt var. Ama aşağıdaki sorgulan hiç kayıt dönmez. Çünkü null = null geçersiz
bir şarttır.
Select * from sysobjects where null = null
Ama bu alttaki sorgudan da tüm tablo döner. Çünkü Null sorgulaması
doğru.
Select * from sysobjects where null is null
Sonuç Olarak:
Bu makalemizde COALESCE
fonksiyonu ile sorgularımızda dinamik where cümlecikleri hazırladık. Bu
sayede birçok parametre alan bir prosedürden veya sorgudan, sorgu yapısını hiç
değiştirmeden sadece birkaç parametreyle de sorgulama yapabildik. Ben örneğin
basit olması açısından tek parametrelik bir örnek yaptım. Ama bu fonksiyonun
gücü daha zor prosedürlerde daha iyi anlaşılır. Ve bu arada SQL Server’ın null
hassasiyetine de kısmen de olsa değinmiş olduk.

[
22.10.2008]