SQL Server’daki predicate mantığında, geleneksel Boolean mantığından farklı olarak eksik değerler de hesaba katılır ve ayrıca sonucun bilinmeyen olduğu durumlarla da ilgilenilir. Bu bölümde, bilinmeyen ve eksik değerlerde üç değerli mantığın nasıl kullanıldığını öğreneceğiz. SQL Server’ın eksik değerler için NULL’u nasıl atadığını ve sorgularda NULL değerin nasıl test edileceğini öğreneceğiz.

Üç Değerli Logic

Baştaki bölümlerde anlatıldığı üzere, SQL Server’ın true veya false döndüren mantıksal test işlemleri için predicate mantığı kullandığını öğrenmiştik. Ancak, SQL Server’da karşılaştırılmakta olan tüm veriler mevcut olmayabilir. Bazı verilerin eksik veya bilinmeyen olma olasılığını göz önünde bulundurarak hareket etmemiz gerekmektedir. Değerler eksik olabilir fakat kendimiz değer verebiliriz, mesela bir tabloda işçilerin ortanca ismi girilmemiş olabilir. Veya kendimiz değer veremeyeceğimiz durumlar da olabilir, mesela işçinin gerçekte ortanca ismi olmayabilir. Her iki durumda da, SQL Server eksik değeri NULL olarak işaretleyecektir. NULL değeri, bahsi geçen üç değerli mantıktaki üçüncü değeri temsil eden UNKNOWN için kullanılır.

Yukarıda da anlatıldığı üzere, hem X hem de Y’nin değerlerini bildiğiniz zaman X>Y ifadesinin TRUE mu yoksa FALSE mu olduğunu belirleyebilirsiniz. Ancak Y değeri eksik olduğunda X>Y ifadesi için ne döndürülecektir? Sorunun cevabı, NULL olarak işaretlenmiş bir UNKNOWN olacaktır. Predicate mantığınızda ve NULL ile işaretli sütunlarda saklanan değerlerde NULL’un olası varlığını hesaba katmanız gerekir. TRUE, FALSE ve UNKNOWN, üç olası sonucu hesaba katmak için üç değerli mantık kullanan sorgular yazmanız gerekmektedir.

Sorgularda NULL Değerlerin Olması

Artık üç değerli mantık ve NULL hakkında kavramsal bir anlayışa sahip olduğumuza göre, SQL Server’ın NULL değerleri kontrol etmek için kullandığı farklı mekanizmaları anlamak gereklidir. Aşağıdaki kuralları göz önünde bulundurmakta fayda vardır:

  • ON, WHERE ve HAVING ifadeleri gibi sorgu filtreleri, NULL değerini FALSE olarak değerlendirecektir. <sütun_değeri> = N testi gerçekleştiren bir WHERE ifadesinde, karşılaştırma sonucu FALSE olduğunda test edilen satır döndürülmez. Sütun değeri veya N değeri NULL olduğunda da satır döndürülmez.

Aşağıdaki sorgu çıktısına bakalım:

SELECT empid, lastname, region
FROM HR.Employees
ORDER BY region ASC;

Bölge (region) değeri eksik olan (NULL olarak işaretlenmiş) çalışanların sıralamanın başına alınmış haldeki sonuç tablosu aşağıdaki gibi dönecektir:

empid lastname region
----------- -------------------- ---------------
5 Buck NULL
6 Suurs NULL
7 King NULL
9 Dolgopyatova NULL
8 Cameron WA
1 Davis WA
2 Funk WA
3 Lew WA
4 Peled WA

Not: Sıkça sorulan bir soru ise NULL değerlerin sonuç kümesinin sonuna koyulabilir mi şeklindedir. Yukarda gördüğünüz gibi, ORDER BY fonksiyonu, NULL değerli kayıtları önce sıralar ve sonra bir araya getirir. Bu davranış override edilemez.

  • ORDER BY ifadesi, NULL değerlere bir grupmuş gibi davranır ve sıralama işleminin ardından sütunda ilk sıraya koyar. Sıralama işlemi uygulanan ve NULL değerler içeren sütunun sorgu sonuçlarını test ettiğinizden ve ayrıca ASC ve DESC sıralamanın NULL değerler üzerindeki etkisini kavradığınızdan emin olun.
  • ANSI uyumlu sorgularda bir NULL değeri, hiçbir zaman başka bir değere, hatta başka bir NULL değere eşdeğer değildir. NULL’u eşitlikle sınamak için yazılmış sorgular doğru sonuç döndürmez.

Aşağıdaki örneğe dikkat ettiğimizde:

SELECT empid, lastname, region
FROM HR.Employees
WHERE region = NULL;

Beklenmeyen sonuç verecektir:

empid lastname region
----------- -------------------- ---------------
(0 row(s) affected)

  • IS NULL (veya IS NOT NULL) operatörünü eşittir (veya eşit değildir) yerine kullanın.

Aşağıdaki örneğe bakalım:

SELECT empid, lastname, region
FROM HR.Employees
WHERE region IS NULL;

Burada doğru sonuçlar dönecektir:

empid lastname region
----------- -------------------- ---------------
5 Buck NULL
6 Suurs NULL
7 King NULL
9 Dolgopyatova NULL
(4 row(s) affected)