ProgramlamaBI analisti

Büyük tablolar için analitik verilerde değer listesine göre (IN/NOT IN) ve eksik veriler (NULL) ile filtreleme şartlarının nasıl en iyi şekilde uygulanacağına ilişkin sorular.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Sorunun Tarihi

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.

Problem

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.

Çözüm

Doğru kombinasyon şu şekilde görünmektedir:

  • Bir listeden değerleri seçiyorsak, eğer NULL değerleri de döndürmek istiyorsak NULL şartı ekleriz:
SELECT * FROM sales WHERE region IN ('Moscow','Samara') OR region IS NULL;
  • Olumsuzlama için açık mantığı kullanırız:
SELECT * FROM sales WHERE (region NOT IN ('Moscow','Samara') OR region IS NULL);
  • Eksik değerleri kesin bir şekilde hariç tutmak için:
SELECT * FROM sales WHERE region NOT IN ('Moscow','Samara') AND region IS NOT NULL;
  • Büyük tablolar için genellikle indeks ile kaplama önemlidir, özellikle değer listesi filtrelemesi sık bir işlemse.

Anahtar özellikler:

  • NULL üzerinde filtrelemeyi açıkça yönetmek gerekir, aksi takdirde satır kaybedilir.
  • IN ve NOT IN kullanımının doğru olması, doğru seçimler için kritik öneme sahiptir.
  • IN/NOT IN'de yer alan alanlarda indeksleme, filtreleme sürecini büyük ölçüde hızlandırır.

Tuzağa Düşüren Sorular.

"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.

Tipik Hatalar ve Anti-Desenler

  • Sadece IN/NOT IN yazmak, NULL için AÇIK bir koşul eklemeden
  • NULL ile NOT IN'in çalışma özelliklerini dikkate almamak
  • Filtreleme alanı için indeksleri optimize etmemek

Gerçek Hayat Örneği

Olumsuz Durum

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:

  • Kısa ve "okunabilir" sorgu

Eksiler:

  • Veri kaybı, geliştiriciler için zor anlaşılır mantık

Olumlu Durum

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:

  • Esnek seçim, veri eksikliklerini doğru bir şekilde dikkate alma
  • İndeksleme sayesinde hızlı çalışma

Eksiler:

  • Model her değiştiğinde mantığı test etmek gerekir.