ทำไมไม่เข้ากับชุดที่มีค่า NULL จะคืนค่าเป็น FALSE / NULL เสมอ?


21

ฉันมีแบบสอบถาม (สำหรับ Postgres และ Informix) ที่มีส่วนNOT INคำสั่งย่อยที่มีแบบสอบถามย่อยในบางกรณีที่ส่งคืนNULLค่าทำให้ส่วนคำสั่งนั้น (และแบบสอบถามทั้งหมด) ไม่สามารถส่งคืนสิ่งใดได้

วิธีที่ดีที่สุดที่จะเข้าใจสิ่งนี้คืออะไร? ฉันคิดว่าNULLเป็นสิ่งที่ไม่มีค่าและดังนั้นจึงไม่ได้คาดหวังแบบสอบถามที่จะล้มเหลว NULLแต่เห็นได้ชัดว่าไม่ใช่วิธีที่ถูกต้องที่จะคิดว่า

คำตอบ:


29

ตรรกะบูลีน - หรือสามตรรกะที่มีค่า

  • IN จดชวเลขเป็นชุดหรือเงื่อนไข
  • x NOT IN (1, 2, NULL) เป็นเช่นเดียวกับ NOT (x = 1 OR x = 2 OR x = NULL)
  • ... เหมือนกัน x <> 1 AND x <> 2 AND x <> NULL
  • ... เหมือนกับtrue AND true AND unknown**
  • ... = unknown**
  • ... ซึ่งเกือบจะเหมือนกับfalseในกรณีนี้เพราะจะไม่ผ่านWHEREเงื่อนไข **

ตอนนี้คือเหตุผลที่ใช้พื้นบ้านEXISTS+ NOT EXISTSมากกว่า+IN NOT INดูเพิ่มเติมที่การใช้ตรรกะไม่สัมพันธ์กับดัชนีมากขึ้น

** หมายเหตุ: unknownเหมือนกับfalseในตอนท้ายของนิพจน์โดยมีWHEREเงื่อนไข
ในขณะที่การประเมินการแสดงออกนั้นก็ไม่เป็นที่รู้จัก
ความคิดเห็น See @ kgrittn ด้านล่างสำหรับสาเหตุ


10
แม้จะมีการชี้แจงว่ามันเป็นความผิดทางเทคนิคและในทางที่สามารถเผาคน ตัวอย่างเช่นหากคุณเห็นx <> NULLว่าแก้ปัญหาFALSEคุณคาดว่าNOT (x <> NULL)จะได้รับการประเมินTRUEและไม่ได้รับการแก้ไข ทั้งUNKNOWNประเมิน เคล็ดลับคือว่าแถวที่เลือกเท่านั้นถ้าWHEREข้อ (ถ้ามี) ประเมินTRUE- แถวถูกละไว้ถ้าประเมินข้ออย่างใดอย่างหนึ่งหรือFALSE UNKNOWNพฤติกรรมนี้ (โดยทั่วไปและสำหรับภาคNOT INแสดงโดยเฉพาะ) ได้รับคำสั่งจากมาตรฐาน SQL
kgrittn

นอกจากนี้NULL NOT IN (some_subquery)ไม่ควรส่งคืนแถวนอกยกเว้นถ้าsome_subqueryไม่ได้คืนแถวใด ๆ ซึ่งเป็นสาเหตุที่แผนการดำเนินการเมื่อทั้งสองคอลัมน์เป็นโมฆะอาจมีราคาแพงกว่ามาก ตัวอย่าง SQL Server
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.