Boş sonuç kümesi her zaman iş kuralını anlatmaz
Ajan, işlem dışında tutulacak kayıtları çıkaran bir SQL sorgusu yazıyor. Önceden iki aday kalan sorgu, dışlama listesine eksik kimlikli tek satır eklendiğinde hiçbir aday döndürmüyor. İlk yorum bütün adayların artık dışlandığı olabilir. Oysa sorgu, bazı karşılaştırmaların sonucunu bilinmeyen saydığı için satırları elemiş olabilir. Verinin iş anlamı ile SQL’in NULL davranışını ayrı incelemek gerekir.
PostgreSQL belgelerinde NOT IN için açıklanan önemli koşul şudur: soldaki değer sağdaki hiçbir değere eşit değilse, fakat sağ tarafta NULL varsa sonuç true yerine NULL olabilir. WHERE aşaması ise yalnız true olan satırları korur. Bilinmeyen sonuç da bu aşamada elenir. Bu yüzden “eşleşme bulamadım” ile “kesinlikle listede değil” aynı karar değildir.Kaynak: PostgreSQL — Subquery ExpressionsKaynak: PostgreSQL — Table Expressions
Bu yazının küçük verisi sentetiktir. Üç aday kimliği eksiksiz ve birbirinden farklıdır. Dışlama listesinde bilinen bir kimlik ve bir bilinmeyen kayıt vardır. Çıktı, koşulu düzelten tek bir sorgudan daha fazlasıdır: bilinmeyen dışlama kaydının nasıl ele alınacağını da görünür kılan bir karar tablosu hazırlayacağız.
Üç aday ve iki dışlama satırı
| Küme | Kayıtlar | Kapsam |
|---|---|---|
| Adaylar | 1, 2, 3 | Aday kimliklerinin tamamı biliniyor |
| Dışlama | 2, NULL | Bir kimlik biliniyor; diğer satır belirsiz |
Ajanın ilk sorgusundaki koşul id NOT IN (SELECT id FROM excluded) olsun. Aday 2, listede bilinen bir eşleşme bulduğu için koşul false olur. Aday 1 ve 3 için 2 ile eşitlik yoktur; ancak NULL satırının hangi kimliği temsil ettiği bilinmez. Bu iki adayda koşul unknown olur. Sonuçta üç satırın hiçbiri WHERE filtresinden geçmez.
| Aday | Bilinen eşleşme | NOT IN sonucu | WHERE korur mu? |
|---|---|---|---|
| 1 | Yok | unknown / NULL | Hayır |
| 2 | 2 ile var | false | Hayır |
| 3 | Yok | unknown / NULL | Hayır |
NULL burada metin olarak “NULL” yazılmış bir kimlik değildir. Boş karakter dizisi veya sıfır da değildir. Örneği yeniden kurarken veritabanına gerçek NULL koyun. Yanlış temsil kullanmak aynı görünüşte farklı bir test üretir. Ayrıca aday tarafında da NULL bulunursa yeni bir durum oluşur; mevcut tablo o durumu kapsamaz.
Önce bilinmeyen kaydın kararını belirleyin
Birinci olası politika, yalnız kesin bilinen kimlik eşleşmelerini dışlamak ve eksik dışlama satırını ayrı inceleme kuyruğuna almaktır. Bu politika altında 2 dışlanır; 1 ve 3 inceleme notuyla aday listesinde kalır. Ancak bu sonuç, eksik satırın gerçekte 1 veya 3 olamayacağını kanıtlamaz. İş kararı bu belirsizliğe rağmen ilerlemeye izin vermelidir.
İkinci politika, dışlama listesinde herhangi bir bilinmeyen kimlik varken tüm işlemi bekletmektir. Bu durumda sonuç “uygun aday yok” değil, “dışlama verisi tamamlanmadan karar verilemiyor” olmalıdır. Sorgu boş döndü diye bu iki durumu aynı başarı mesajıyla göstermek, iş akışının anlamını değiştirir. Uygun politika veri sahibi tarafından belirlenir.
WITH candidates(id) AS (VALUES (1),(2),(3)), excluded(id) AS (VALUES (2),(NULL)) SELECT c.id FROM candidates c WHERE NOT EXISTS ( SELECT 1 FROM excluded e WHERE e.id = c.id ) ORDER BY c.id; -- Beklenen: 1, 3. NULL dışlama satırı ayrıca incelenir.
NOT EXISTS alt sorguda adayla eşleşen satır bulunup bulunmadığını sınar. NULL eşitliği true olmadığı için eksik satır bilinen eşleşme oluşturmaz. Bu davranış birinci politikaya uygundur; ikinci politikayı kendiliğinden uygulamaz. Eksik kaydı ayrıca sayıp karar kapısına bağlamak gerekir. Sorgu operatörü seçimi, belirsiz verinin iş sorumluluğunu ortadan kaldırmaz.Kaynak: PostgreSQL — Subquery Expressions
Sorguyla birlikte karar kapsamını isteyin
Aday kimlikleri 1,2,3; dışlama kimlikleri 2 ve gerçek SQL NULL. Aday kimlikleri NULL olamaz. NOT IN sorgusunun her aday için true/false/unknown sonucunu açıkla. Sonra yalnız bilinen eşleşmeleri dışlayan NOT EXISTS sorgusu yaz; eksik dışlama satırını ayrıca raporla. Bu politikanın 1 ve 3 için kesin güvence vermediğini belirt. Herhangi bir eksik dışlama varsa işlemi bekletme politikasını ayrı göster. Salt okunur, yeniden kurulabilir küçük veri kullan.
NOT IN: sonuç kümesi boş; aday 1 ve 3 için koşul unknown, 2 için false. Bilinen eşleşme politikası: adaylar 1 ve 3; dışlanan 2; inceleme kuyruğu 1 eksik satır. Eksiklikte bekletme politikası: işlem bekliyor; uygun aday sayısı henüz kesinleştirilmedi.
Ajanın yanıtını değerlendirirken yalnız iki kimliğin dönmesini yeterli saymayın. Eksik satırın görünür kalması, üç değerli mantığın açıklanması ve karar durumunun doğru adlandırılması da gerekir. “NULL değerleri sildim, sorun çözüldü” açıklaması, bu silmenin hangi politikaya dayandığını söylemiyorsa tamamlanmış bir çözüm değildir.
Testi kullandığınız veritabanı sürümünde çalıştırın ve sonucu kimlik sırasıyla kaydedin. Eğitim örneği başka bir SQL motorunda denenirse bunu açıkça yazın; bir motorun yerel çıktısını başka motorun çalıştırma kanıtı gibi sunmayın. Burada beklenen mantıksal sonuçlar ile kullanılan test ortamının bilgisi ayrı doğrulama kayıtlarıdır.
NULL satırını kaldırınca ne değişir?
Dışlama listesini yalnız 2 yapın. Bu kez NOT IN, aday 1 ve 3 için true verir; sonuç 1 ve 3 olur. NOT EXISTS de aynı iki kimliği döndürür. Bu eşitlik, ilk verideki farkın sorgu yazımındaki rastgele bir ayrıntıdan değil, NULL içeren kapsamdan doğduğunu gösterir. Tek değişkenli karşı örnek, uzun bir üretim sorgusundan daha kolay denetlenir.
Dışlama tablosunda tekrarlanan 2 satırları bulunması ayrı bir durumdur. Bu küçük varlık sorgusunda ikinci 2, yeni bir kimlik eşleşmesi yaratmaz. Dolayısıyla NULL sorununun yerine yinelenen satır temizliği yapmak doğru nedeni hedeflemez. Gerçek veri üzerinde iki hata aynı anda bulunabilir; kontrolleri ayrı adlarla yürütün.
Eksik kimliği tamamlayın
İlk dışlama listesindeki NULL değerinin sonradan 3 olduğu doğrulansın. İki sorgunun sonucunu yeniden bulun. Ardından dışlama listesinin tamamen boş olduğu başka bir denemeyi düşünün. Hangi adayların kaldığını ve bu iki yeni veri durumunda inceleme kuyruğunun nasıl değiştiğini yazın.
Dışlama 2,3 olduğunda her iki sorgu yalnız 1 döndürür; eksik satır kalmaz. Dışlama tablosu boş olduğunda bu örnekte üç aday da kalır. Adayların NULL olmadığı varsayımı korunur. Boş liste ile içinde bir NULL satırı bulunan liste aynı veri değildir.
Kendi akışınıza taşırken raporun üç ayrı sayısını koruyun: değerlendirilen aday, bilinen eşleşmeyle dışlanan aday ve çözülmemiş dışlama kaydı. Bu sayılar ile açık karar durumu birlikte bulunduğunda, boş sonuç ekranının gerçekten ne söylediği anlaşılır.
Kaynaklar ve doğrulama
- PostgreSQL — Subquery Expressions
NOT IN karşılaştırmasında eşleşme yokken sağ taraftaki NULL değerinin bilinmeyen sonuç üretmesi.
Erişim ve kontrol: - PostgreSQL — Table Expressions
Dış birleştirmede ON ve WHERE koşullarının farklı aşamalarda uygulanması; WHERE yalnız true satırlarını korur.
Erişim ve kontrol:
AI Ajanları ve İş Akışı Otomasyonu
Bu sorgu örneğini AI Ajanları ve Otomasyon eğitimine taşıyarak eksik kayıt, araç sonucu ve işlem kararı arasındaki bağlantıyı kendi akışınızda kurabilirsiniz.
- Kuruma özel planlanır