เมื่อต้องการแยกแยะว่า ค่าในคอลัมน์เป็น NULL จริง หรือเป็น ค่า Default ของตาราง ให้ใช้ IFNULL() ร่วมกับ DEFAULT() ฟังก์ชัน
สร้างตารางมี Default Value
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(100) DEFAULT 'Larry',
Age int DEFAULT NULL
);
เพิ่มข้อมูลทดสอบ
mysql> insert into DemoTable(Name,Age) values('John',23); -- ระบุทั้งคู่
mysql> insert into DemoTable values(); -- ใช้ Default ทั้งคู่
mysql> insert into DemoTable(Name) values('David'); -- Name=David, Age=Default NULL
mysql> insert into DemoTable(Age) values(24); -- Name=Default Larry, Age=24
ข้อมูลในตาราง
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | John | 23 | | 2 | Larry | NULL | | 3 | David | NULL | | 4 | Larry | 24 | +----+-------+------+
คำสั่ง: ดึงเฉพาะแถวที่ Name ไม่ใช่ Default (คือ John และ David)
mysql> select * from DemoTable WHERE IFNULL(Name, DEFAULT(Name)) <> DEFAULT(Name);
ผลลัพธ์
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | John | 23 | | 3 | David | NULL | +----+-------+------+
คำอธิบายตรรกะ
DEFAULT(Name)คืนค่า 'Larry' (ค่า Default ของคอลัมน์)IFNULL(Name, DEFAULT(Name))- ถ้า Name เป็น NULL ใช้ Default แทน<> DEFAULT(Name)- เปรียบเทียบว่าต่างจาก Default จริงหรือไม่
| แถว | Name จริง | IFNULL(Name, Default) | Default(Name) | ต่างจาก Default? |
|---|---|---|---|---|
| 1 | John | John | Larry | ✅ ใช่ |
| 2 | NULL | Larry | Larry | ❌ ไม่ (เป็น Default) |
| 3 | David | David | Larry | ✅ ใช่ |
| 4 | Larry (Default) | Larry | Larry | ❌ ไม่ (เป็น Default) |
กรณีใช้งาน
- Audit Trail - ตรวจสอบฟิลด์ที่ผู้ใช้กรอกจริง vs Default
- Data Quality - หาข้อมูลที่ยังไม่ได้กรอก (ยังเป็น Default)
- Migration - ระบุคอลัมน์ที่ต้องการอัปเดต
ฟังก์ชัน DEFAULT()
- ทำงานได้ใน: SELECT, WHERE, ORDER BY, DEFAULT() ใน VALUES() ของ INSERT
- ไม่ทำงานใน: Trigger body (บางเวอร์ชัน), Prepared Statement บางรูปแบบ