เมื่อทำการคำนวณคณิตศาสตร์ (บวก ลบ คูณ หาร) บนคอลัมน์ที่มีค่า NULL ผลลัพธ์จะเป็น NULL เสมอ (เพราะ NULL + Anything = NULL) ต้องใช้ IFNULL() หรือ COALESCE() แปลง NULL เป็น 0 (หรือค่าอื่น) ก่อนคำนวณ
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล (มี NULL):
mysql> CREATE TABLE DemoTable1462 (Value1 INT, Value2 INT); mysql> INSERT INTO DemoTable1462 VALUES (10, 20), (50, NULL), (NULL, 70);
ดูข้อมูล:
mysql> SELECT * FROM DemoTable1462; +--------+--------+ | Value1 | Value2 | +--------+--------+ | 10 | 20 | | 50 | NULL | | NULL | 70 | +--------+--------+
คำนวณผลรวม โดยแปลง NULL เป็น 0:
mysql> SELECT IFNULL(Value1, 0) + IFNULL(Value2, 0) FROM DemoTable1462;
ผลลัพธ์:
+-----------------------------------+ | IFNULL(Value1,0)+IFNULL(Value2,0) | +-----------------------------------+ | 30 | | 50 | | 70 | +-----------------------------------+
ฟังก์ชันจัดการ NULL ในการคำนวณ
| ฟังก์ชัน | ไวยากรณ์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|---|
| IFNULL | IFNULL(expr, val) | MySQL Specific คืนค่า val หาก expr เป็น NULL | IFNULL(col, 0) |
| COALESCE | COALESCE(v1, v2, ..., vn) | มาตรฐาน SQL คืนค่าแรกที่ไม่เป็น NULL | COALESCE(col1, col2, 0) |
| NULLIF | NULLIF(expr1, expr2) | คืน NULL หาก expr1 = expr2 | NULLIF(price, 0) |
ตัวอย่างการคำนวณหลากหลาย
-- บวก SELECT IFNULL(a, 0) + IFNULL(b, 0) AS SumAB FROM t; -- ลบ SELECT IFNULL(a, 0) - IFNULL(b, 0) AS DiffAB FROM t; -- คูณ (NULL * Anything = NULL → ต้อง IFNULL ทั้งคู่) SELECT IFNULL(a, 1) * IFNULL(b, 1) AS ProdAB FROM t; -- หาร (ระวังหารศูนย์) SELECT IFNULL(a, 0) / NULLIF(IFNULL(b, 0), 0) AS DivAB FROM t; -- ค่าเฉลี่ยข้าม NULL SELECT AVG(IFNULL(score, 0)) FROM t; -- นับ NULL เป็น 0 SELECT AVG(score) FROM t; -- ข้าม NULL (Default AVR Behavior)
แนวทางปฏิบัติที่ดี
- ใช้ COALESCE แทน IFNULL เพื่อ Portability (มาตรฐาน SQL)
- กำหนด
DEFAULT 0ตอนสร้างตาราง หากค่าว่างหมายถึงศูนย์ - ใช้
NULLIFป้องกัน Division by Zero - โครงสร้าง Schema ให้ถูกต้อง: NOT NULL + DEFAULT 0 สำหรับคอลัมน์ตัวเลขที่บังคับ