NULL içeren bir set ile NOT IN neden her zaman FALSE / NULL döndürür?


21

NOT INBazı durumlarda NULLdeğerler döndüren bir alt sorgu içeren bir cümle ile (Postgres ve Informix için) bir sorgu yaptım , bu cümlenin (ve tüm sorgunun) hiçbir şey döndürememesine neden oldu.

Bunu anlamanın en iyi yolu nedir? NULLDeğeri olmayan bir şey olarak düşündüm ve bu nedenle sorgunun başarısız olmasını beklemiyordum, ama açıkçası düşünmenin doğru yolu bu değildi NULL.

Yanıtlar:


29

Boole mantığı - veya Üç değerli mantık

  • IN, bir dizi OR koşulu için kısa yoldur.
  • x NOT IN (1, 2, NULL) aynıdır NOT (x = 1 OR x = 2 OR x = NULL)
  • ... aynıdır x <> 1 AND x <> 2 AND x <> NULL
  • ... aynı true AND true AND unknown**
  • ... = unknown**
  • ... falsebu durumda olduğu gibi aynıdır , WHEREkoşulu geçmeyecektir **

İşte bu yüzden halk EXISTS+ NOT EXISTSyerine IN+ kullanıyor NOT IN. Ayrıca bakınız endeksler ilişkin DEĞİL mantığı kullanımını daha

** Not: Bir koşuldaki ifadenin sonundaki ile unknownaynıdır . İfade değerlendirilirken, o zaman bilinmiyor . Neden @ kgrittn'in nedeniyle ilgili yorumu aşağıda görebilirsinizfalseWHERE


10
Açıklamaya rağmen, teknik olarak yanlıştır ve birini yakabilecek şekildedir. Örneğin, x <> NULLçözüm olarak FALSEgörüyorsanız, NOT (x <> NULL)değerlendirmeyi beklersiniz TRUEve öyle olmaz. Her ikisi de değerlendirir UNKNOWN. İşin püf noktası, bir satırın yalnızca WHERE((varsa) fıkrası olarak değerlendirilirse seçilmesidir TRUE- fıkra ya FALSEda olarak değerlendirilirse bir satır atlanır) UNKNOWN. Bu davranış (genel olarak ve NOT INözellikle de belirteç için) SQL standardı tarafından zorunludur.
kgrittn

Ayrıca herhangi bir satır döndürmüyor NULL NOT IN (some_subquery)olması dışında dış satırı some_subquerygeri döndürmemelisiniz. Bu nedenle, her iki sütun da Boş olduğunda yürütme planı çok daha pahalı olabilir. SQL Server Örneği
Martin Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.