ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ การออกแบบ User Interface (UI) มักมีการใช้องค์ประกอบที่เรียกว่า Tri-State Button ซึ่งเป็นปุ่มที่มีสถานะถึง 3 ระดับ (เช่น ไม่ใช้งาน, อยู่ระหว่างการเปลี่ยนสถานะ, และใช้งานอยู่) การจัดการสถานะข้อมูลที่ซับซ้อนเช่นนี้ย่อมส่งผลต่อการออกแบบฐานข้อมูลและการเขียนคำสั่ง SQL อย่างหลีกเลี่ยงไม่ได้
คำถามที่นักพัฒนาหลายคนสงสัยคือ: เราจะเขียนคำสั่ง WHERE ใน SQL อย่างไร เพื่อดึงข้อมูลที่อยู่ในสถานะทั้งสามนี้ออกมาได้อย่างถูกต้อง? คำตอบคือ แม้จะดูซับซ้อน แต่การใช้หลักการของ NULL และ Logical Operator อย่างเหมาะสม จะทำให้งานนี้ง่ายกว่าที่คิด โดยเฉพาะอย่างยิ่งเมื่อเราใช้ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูลที่ทรงพลัง
💡 หลักการจัดการ Tri-State ในฐานข้อมูล PostgreSQL
ในการจำลองสถานะ 3 ระดับ (Tri-State) ลงในคอลัมน์เดียว (เช่น status) เราสามารถกำหนดค่าได้ดังนี้:
- สถานะซ้าย (Inactive): กำหนดค่าเป็นสตริงเฉพาะ เช่น
'I' - สถานะขวา (Active): กำหนดค่าเป็นสตริงเฉพาะ เช่น
'A' - สถานะกลาง (Indeterminate/Active): สถานะนี้มักจะไม่มีค่าที่ชัดเจน หรือเป็นสถานะที่รอการกำหนดค่า จึงเหมาะสมที่สุดที่จะใช้ค่า
NULLในทางฐานข้อมูล
ดังนั้น หากเราต้องการดึงข้อมูลทั้งหมดที่อยู่ในสถานะใดสถานะหนึ่งจาก 3 สถานะนี้ เราจะต้องรวมเงื่อนไขการตรวจสอบค่าที่เป็นสตริง ('I' และ 'A') เข้ากับการตรวจสอบค่า NULL โดยใช้ตัวดำเนินการ OR
🛠️ ตัวอย่างการเขียน SQL Query ใน PostgreSQL
สมมติว่าเรามีตารางชื่อ pitt_post ที่มีคอลัมน์ status และเราต้องการดึงแถวข้อมูลทั้งหมดที่อยู่ในสถานะใดสถานะหนึ่ง (ไม่ว่าจะเป็น ‘I’, ‘A’, หรือ NULL) เราจะต้องเขียนคำสั่งดังนี้:
SQL
SELECT * <code>
FROM pitt_post <code>
WHERE status = 'I' <code>
OR status = 'A' <code>
OR status IS NULL;
คำอธิบายโค้ด:
status = 'I': ตรวจสอบแถวที่มีสถานะ Inactive (ซ้าย)status = 'A': ตรวจสอบแถวที่มีสถานะ Active (ขวา)status IS NULL: ส่วนนี้คือหัวใจสำคัญของการจัดการ Tri-State เพราะเราต้องตรวจสอบว่าค่าNULLนั้นมีอยู่หรือไม่ ซึ่งไม่สามารถใช้status = NULLได้
การใช้ OR เชื่อมเงื่อนไขทั้งสามเข้าด้วยกัน ทำให้ PostgreSQL สามารถกรองข้อมูลที่ตรงตามสถานะใดสถานะหนึ่งได้อย่างสมบูรณ์แบบ
✅ สรุปและแนวคิดเชิงสถาปัตยกรรม
การจัดการ Tri-State ในฐานข้อมูลด้วย PostgreSQL นั้น ไม่ได้เป็นเรื่องของไวยากรณ์ที่ซับซ้อน แต่เป็นเรื่องของการเข้าใจประเภทข้อมูล (Data Type) และการใช้เงื่อนไข NULL อย่างถูกต้อง
ในมุมมองของ Senior Architect การออกแบบนี้แสดงให้เห็นถึงความสำคัญของการเลือกใช้ NULL เพื่อแทนสถานะที่ ‘ไม่ทราบค่า’ หรือ ‘อยู่ระหว่างการดำเนินการ’ ซึ่งเป็น Best Practice ที่ทำให้โค้ดมีความชัดเจนและยืดหยุ่นต่อการเปลี่ยนแปลงในอนาคต การใช้ OR ในการรวมเงื่อนไขจึงเป็นทางออกที่ตรงประเด็นและมีประสิทธิภาพสูงสุดในการ Query ข้อมูล 3 สถานะนี้