Sıklıkla dinamik olarak belirlenecek filtreleme kriterlerini içeren sorgular oluşturulması gerekir — değer listesi kullanıcı arayüzünden belirlenirken, eksik değerler (NULL) de sonuca dahil olabilmelidir. Böyle bir sorgunun büyük veri hacimlerinde hızlı çalışması ve SQL semantiği açısından doğru olması gerekmektedir.
IN, NOT IN ve NULL kontrol koşullarının yanlış bir şekilde birleştirilmesi, sonuçların beklenmedik olmasına neden olabilir; çünkü SQL'de "NULL IN (...)" ifadesi her zaman UNKNOWN döndürür ve "NOT IN" en az bir liste elemanı NULL olduğunda boş sonuca yol açabilir. Kötü yazılmış bir koşul ile büyük veri üzerindeki performans hızla düşebilir.
Doğru kombinasyon şu şekilde görünmektedir:
SELECT * FROM sales WHERE region IN ('Moscow','Samara') OR region IS NULL;
SELECT * FROM sales WHERE (region NOT IN ('Moscow','Samara') OR region IS NULL);
SELECT * FROM sales WHERE region NOT IN ('Moscow','Samara') AND region IS NOT NULL;
Anahtar özellikler:
"WHERE field NOT IN ('a', NULL)" kontrol edildiğinde ne olur?
Sonuç her zaman boştur, çünkü herhangi bir satır NULL ile listede karşılaştırıldığında UNKNOWN döner ve her şeyi filtreler.
Kod örneği:
SELECT * FROM test WHERE name NOT IN ('Ivan', NULL);
"IN (NULL,...)" ifadesi NULL olan satırlar için değer döndürür mü?
Hayır. NULL IN (...) ifadesi her zaman UNKNOWN döndürür, TRUE değil.
Büyük bir değer listesi için filtrelemeyi nasıl hızlandırabiliriz?
İndeks kullanmak ve büyük bir liste varsa (yüzlerce/binlerce değer) geçici bir tablo ile JOIN uygulamak tercih edilir; bu, uzun bir IN ifadesine göre filtrelemeyi hızlandırır.
Bir analitik raporda "WHERE city NOT IN ('London', field_2, NULL)" kullanıldı. Sonuç — tamamen boş, kimse kaybedilen satırların nedenini anlayamadı.
Artılar:
Eksiler:
CRM'de müşteri bölgeleri listesi seçildi ve "Boş değerleri dahil et" adlı ek bir buton eklendi. Filtre mantığı:
... WHERE city IN ('SPB','NNov') OR city IS NULL
Artılar:
Eksiler: