อะไรคือความแตกต่างระหว่าง! = NULL และไม่เป็น NULL ในการแสดงออกของตัวกรอง QGIS?


26

ฉันมีชั้นรูปร่างที่มีคุณลักษณะที่มีค่าที่ฉันต้องการจะใช้ตัวกรองสำหรับค่าที่แตกต่างจากNULLNULL

ป้อนคำอธิบายรูปภาพที่นี่

การใช้ gui ที่มีอยู่สำหรับการสร้างเคียวรีนั้นจะพยายามอย่างสังหรณ์ใจ

"obj_art" != NULL

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งหมายความว่า'ให้คุณสมบัติทั้งหมดที่มีแอตทริบิวต์ "obj_art" ต่างจากNULL" (นับได้มากกว่า 0 อย่างแน่นอน) การทดสอบข้อความค้นหานี้ให้ผลลัพธ์ที่แปลกประหลาดจากมุมมองของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสิ่งที่ฉันได้เรียนรู้จนถึงตอนนี้ก็คือฉันสามารถบรรลุสิ่งนี้ได้โดยใช้

"obj_art" IS NOT NULL

คำถามคือความแตกต่างระหว่าง!= NULLและIS NOT NULLคืออะไร?


เท่าที่ฉันรู้มันเป็นเพียงไวยากรณ์ เมื่อใช้เป็นโมฆะหรือไม่ อื่นใช้ = หรือ! =
nielsgerrits

"ใครจะลองโดยสัญชาตญาณ"จริงเหรอ? ทำไม? NULL ไม่ใช่ค่า มันคือตัวตนที่ไม่มีคุณค่า คุณไม่สามารถ "เท่ากับ" NULL! ผู้ประกอบการ!=ไม่ได้หมายความว่า "ไม่"; หมายความว่า "ไม่เท่ากับ" IS NOTหมายถึง "ไม่ได้" ดังนั้นผมจึงคิดว่านี่เป็นงานง่ายได้อย่างสมบูรณ์แบบ :)
Lightness แข่งกับโมนิกา

@LightnessRacesinOrbit หากไม่มีความเข้าใจที่NULLไม่ได้เป็นค่าฉันจะบอกว่ามันเป็นเรื่องง่ายที่จะลองใช้=หรือ!=เป็นวิธีที่คุณประเมินค่าอื่น ๆ มันไม่ได้จนกว่าคุณจะรู้ว่าNULLไม่ใช่ค่าที่ว่ามันเป็นงานง่ายที่จะใช้มากกว่าIS NOT !=หลายคนไม่ทราบว่าNULLแท้จริงแล้วคืออะไร
Midavalo

และยิ่งกว่านั้นใน GUI NULLอยู่ในรายการค่า (cp. ด้านบน) และถือว่าเป็นค่า 'ปกติ' และไม่มีปุ่มIS NULLหรือพลาดเช่นนั้นเหรอ! ดังนั้นเมื่อเพียงพิมพ์คำถามเหล่านี้และด้วยความรู้ที่NULLจะต้องได้รับการปฏิบัติในลักษณะพิเศษที่เราสามารถพูดคุยเกี่ยวกับสัญชาตญาณ แต่สำหรับ shure ไม่ได้อยู่ในบริบทของ GUI นี้
Jochen Schwarze

@ Midavalo: ในขณะที่เป็นจริงฉันขอแนะนำอย่างนอบน้อมไม่ใช้คุณสมบัติภาษาโดยไม่ต้องค้นหาว่ามันคืออะไร :) การเขียนโปรแกรมโดยคาดเดาไม่ทำงาน
การแข่งขัน Lightness กับโมนิก้า

คำตอบ:


33

คำเตือน:เนื่องจากไวยากรณ์สำหรับการกรองใน QGIS ทำงานร่วมกับ SQL ฉันจึงสมมุติว่ากฎ SQL นั้นมีผล ฉันไม่แน่ใจว่าถูกต้องทั้งหมด แต่ดูเหมือนสมเหตุสมผลและอธิบายพฤติกรรม


ตัวกรองใช้งานได้กับ SQL นั่นคือสาเหตุที่คุณต้องมองหาคำตอบ

ในระยะสั้นเมื่อใช้ผู้ประกอบการลอจิคัลร่วมกับผลที่ได้คือเสมอnull nullแต่เพื่อทดสอบnullSQL มาพร้อมกับIS (NOT)ฟังก์ชันการเปรียบเทียบซึ่งอนุญาตให้ใช้สำหรับการกรองที่คุณต้องการ

ตรวจสอบคำตอบของชาวโบฮีเมียเกี่ยวกับ stackoverflow สำหรับการสนทนาในเชิงลึก


19

NULLคือไม่ได้มีค่าจึงไม่สามารถเท่ากับ=หรือไม่เท่ากัน!=อะไร มันไม่เหมือนกับศูนย์0ซึ่งเป็นค่า

A NULLระบุว่าไม่มีการบันทึกค่าใด ๆ ในเซลล์ที่คุณกำลังดู ในการตรวจสอบว่ามีค่าอยู่หรือไม่คุณถามว่ามีเซลล์IS NULLหรือไม่IS NOT NULL

  • IS NULL ตรวจสอบเพื่อดูว่าเซลล์ว่างเปล่า
  • IS NOT NULL ตรวจสอบเพื่อดูว่าเซลล์ไม่ว่างเปล่า

หากคุณมีข้อมูลบางส่วนที่เป็นค่าที่มีOne, Two, Threeและส่วนที่เหลือNULLและคุณต้องการที่จะหาทุกอย่างที่ไม่ได้Twoคุณจะต้องใช้สิ่งที่ต้องการ

value != 'Two' OR value IS NULL

เนื่องจากค่า NULL จะไม่ถูกส่งกลับในเคียวรีเท่ากับ / ไม่เท่ากับเคียวรี หากคุณใช้เพียงvalue != 'Three'ผลลัพธ์จะยกเว้นNULLระเบียนทั้งหมดเนื่องจากNULLไม่ใช่ค่าที่สามารถเท่ากันหรือไม่เท่ากัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.