Üye Ol | Bağlan
ANASAYFA | VERİTABANI | PROGRAMLAMA | HAKKIMIZDA | BLOG | ETKİNLİKLER | KAYNAKLAR
Yazı Hakkında
  Seviye:
Yazar:Abdullah ÇATAKLI
Okunma: 5394
Oylanma:47 kişi (8,64/10)
 
 
Tavsiye Et
Yazıcı Dostu
Evrak Çantama Al
 
KATEGORİLER
  VERİTABANI
    ORACLE
    HIZLI SQL KURSU-1
    SQL SERVER 2005
    SQL SERVER 2000
PROGRAMLAMA
    JAVA
    ADO.NET
    MOBİL PROGRAMLAMA
    ASP.NET
    VB.NET
    C# ve C#.NET
İŞARETLEME DİLLERİ
    HIZLI WEB PR. KURSU
    XML
HABERLER
EĞİTİM & SERTİFİKA
KİTAP
SÖYLEŞİ
HAKKIMIZDA
BLOG
ETKİNLİKLER
 
  XHTML,CSS,VBScript,ASP SQL Lab 2.0 Beta
Hızlı SQL Kursu(Yeni)
 
 
Son Eklenenler
 
SQL SERVER 2005
COALESCE Fonksiyonu ile Dinamik Where Şartları Hazırlamak

Transact SQL’de SQL Server 2008 Yenilikleri-1

SQL Server’da verileri Türkçe Karaktere Dönüştürmek

StrToCursor Prosedürü ile Hızlı ve Kolay Cursor Açmak

Triggerı Hangi Olayın Tetiklediğini Tespit Etmek

İleri Cursor Açma Tekniği

Yazılımcılar için SQL Server Erişim Güvenliği

JAVA
Java'ya GiriŞ - 3 : JCreator Editörü

HABERLER
Verivizyon.com Topluluk Kurucusuna MVP Ödülü

Verivizyon yeni sunucularında

 
Bu Bölümden
MS SQL Server'a Erişmek Hakkında Her şey(10033 yükleme)
Yazılımcılar için SQL Server Erişim Güvenliği(7493 yükleme)
SQL Server Verilerini 2005 Sürüme Aktarmak(7173 yükleme)
SQL Server 2005'de CLR Desteği-2(6765 yükleme)
İleri Cursor Açma Tekniği(6554 yükleme)
Rütbeleme Fonksiyonları ile Kayıtları Sıralamak(6170 yükleme)
COALESCE Fonksiyonu ile Dinamik Where Şartları Hazırlamak(5394 yükleme)
Tablo Tipli Kullanıcı Tanımlı Fonksiyonlar Kodlamak(5391 yükleme)
Transact SQL’de SQL Server 2008 Yenilikleri-1(5246 yükleme)
Satırları Sütuna veya Sütunları Satıra Dönüştürmek(5155 yükleme)
 
 
E-LİSTE
BT ve özellikle Veritabanı ile ilgili haber, yenilik ve etkinlikler hakkında önceden haber almak için bize e-mail adresinizi bırakabilirsiniz.

ANKET
SQL Server 2008'e geçtiniz mi?
Sorunsuz Geçtik
2005'e yeni geçtik
2000 bize yetiyor.
 

 


COALESCE Fonksiyonu ile Dinamik Where Şartları Hazırlamak


Bu makalemizde COALESCE fonksiyonu ile sorgularımızda where kısmında istediğimiz şartları elimine edip etkisiz hale getireceğiz ve dinamik where cümlecikleri hazırlayacağız. Yani SQL cümleciğimizin WHERE kısmında bulunduğu halde etkisi olmayan şartlar hazırlamayı göreceğiz.

Ö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]

Oy Ver: Kötü 1  2  3  4  5  6  7  8  9  10  İyi


YORUMUNUZ
Kullanıcı :
Başlık :
İçerik:
Lütfen Giriş Yapınız

Abdullah ÇATAKLI
Yazarımız 1980 ANKARA Doğumlu olup aslen Çankırı'lıdır. Uygulamalarını Delphide geliştirmektedir. VTYS olarak MsSql Server ve Oracle kullanmaktadır. C# ve Java'ya yönelik çalışmaları devam etmektedir. Şu an Ankara'da özel bir şirkette Kamu Kurumlarına projeler geliştirmektedir.
Yazara Ait Son Eklenen Makaleler
COALESCE Fonksiyonu ile Dinamik Where Şartları Hazırlamak(22.10.2008)
Triggerı Hangi Olayın Tetiklediğini Tespit Etmek(25.06.2008)
İleri Cursor Açma Tekniği(04.11.2007)
StrToCursor Prosedürü ile Hızlı ve Kolay Cursor Açmak(12.10.2007)
Nedir bu DBCC komutları?(11.04.2007)
TC Kimlik No Doğrulama Algoritması(12.02.2007)
T-Sql Tasarım Desenleri 1 : Obje Aramak(26.05.2006)
101 T-SQL İpucu-4(23.05.2006)
T-SQL Programcısına Hazır Kütüphane(18.04.2006)
101 Transact SQL İpucu: Bölüm-3(10.04.2006)
 

© 2003 - 2005 Verivizyon.com 'Developer Academy'. Tüm hakları saklıdır. Kullanım Sözleşmesi | Gizlilik İlkeleri | İletişim