NULL ใน SQL คืออะไร ทำไม = NULL ถึงหาไม่เจอ และวิธีแก้
เจาะลึกปัญหา NULL ใน SQL จากบทความของ Michael Nocito อธิบายเหตุผลที่การเปรียบเทียบกับ NULL ให้ผลลัพธ์เป็นศูนย์ พร้อมวิธีใช้ IS NULL และ NOT EXISTS ที่ถูกต้อง

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- NULL ใน SQL หมายถึงข้อมูลที่ไม่รู้ค่า ไม่ใช่ศูนย์หรือข้อความว่างเปล่า
- การใช้เครื่องหมายเท่ากับ (= NULL) จะให้ผลลัพธ์เป็นศูนย์แถวเสมอเพราะได้ค่า Unknown
- คำสั่ง WHERE จะคัดกรองเฉพาะแถวที่ให้คำตอบว่าใช่ (Yes) เท่านั้น
- การใช้ NOT IN ร่วมกับ Subquery ที่มีค่า NULL อาจทำให้ผลลัพธ์หายเกลี้ยงอย่างไร้ร่องรอย
บทความจาก Michael Nocito นักวิเคราะห์ข้อมูล เผยแพร่เมื่อวันที่ 7 สิงหาคม 2026 ได้ระบุถึงปัญหาคลาสสิกที่นักพัฒนา SQL มักเจอ นั่นคือการที่เคียวรี (Query) ไม่แสดงผลลัพธ์ตามที่คาดหวัง โดยมีสาเหตุหลักมาจากค่า NULL ซึ่งมักสร้างความปวดหัวให้กับผู้เขียนโค้ดอยู่เสมอ
ในตารางข้อมูลตัวอย่าง support-tickets ที่มีทั้งหมด 10 แถว ซึ่งมีตั๋ว 3 ใบที่ไม่มีเวลาปิดงาน 2 ใบไม่มีภูมิภาค และอีก 2 ใบไม่มีผู้รับผิดชอบ (Assignee) หากเราลองรันคำสั่ง SELECT * FROM tickets WHERE assignee = NULL; ผลลัพธ์ที่ได้จะไม่ใช่ตั๋ว 2 ใบที่ไม่มีผู้รับผิดชอบ แต่จะได้ศูนย์แถวกลับมาทุกครั้งบนทุกระบบฐานข้อมูล

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
แนวคิดสำคัญที่ต้องทำความเข้าใจคือ ฐานข้อมูล SQL ใช้ตรรกะแบบสามค่า (Three-valued logic) ได้แก่ ใช่ (Yes) ไม่ใช่ (No) และไม่รู้ (Unknown) เมื่อใดก็ตามที่มีค่า NULL เข้ามาเกี่ยวข้อง ผลลัพธ์จากการเปรียบเทียบจะกลายเป็น Unknown ทันที และเนื่องจากคำสั่ง WHERE ยอมให้เฉพาะแถวที่เป็น Yes ผ่านไปได้ ค่า Unknown จึงถูกปัดตกหายไปอย่างไร้เสียงเตือนใดๆ
เมื่อต้องการตรวจสอบค่าที่ขาดหายไป จำเป็นต้องใช้คำสั่งเฉพาะอย่าง IS NULL ซึ่งเป็นการตั้งคำถามกับช่องว่างของข้อมูลโดยตรง เช่น WHERE the_column IS NULL ซึ่งจะให้คำตอบว่าใช่หรือไม่ใช่ที่ชัดเจน
"NULL does not mean zero, and it does not mean empty text. NULL means unknown: this row has an assignee slot, and nobody has said what goes in it."
Michael Nocito
นอกจากนี้ อีกหนึ่งกับดักที่อันตรายที่สุดใน SQL คือการใช้ NOT IN ร่วมกับ Subquery ที่มีค่า NULL ซ่อนอยู่ ซึ่งอาจทำให้คำสั่งส่งคืนค่าว่างเปล่าทั้งหมดโดยไม่มีข้อผิดพลาดแจ้งเตือน วิธีแก้คือการกรองค่า NULL ออกจาก Subquery หรือเปลี่ยนมาใช้คำสั่ง NOT EXISTS แทน เพื่อความปลอดภัยและแม่นยำในการดึงข้อมูล
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น