ฟังก์ชัน SUM() จะคืนค่า NULL เมื่อไม่มีแถวที่ Match (Empty Result Set) ใช้ IFNULL() หรือ COALESCE() เพื่อแปลงเป็น 0
ปัญหา
SELECT SUM(NULL);
-- ผลลัพธ์: NULL (ไม่ใช่ 0)
วิธีที่ 1: IFNULL() - MySQL Specific
SELECT IFNULL(SUM(NULL), 0) AS SUMOFTWO;
-- ผลลัพธ์: 0
วิธีที่ 2: COALESCE() - ANSI Standard (แนะนำ)
SELECT COALESCE(SUM(NULL), 0) AS SUMOFTWO;
-- ผลลัพธ์: 0
ตัวอย่างใช้งานจริง
-- ตาราง Sales
CREATE TABLE sales (
id INT PRIMARY KEY,
amount DECIMAL(10,2),
sale_date DATE
);
-- Query ยอดขายรายวัน (วันที่ไม่มียอดขาย = 0)
SELECT
sale_date,
COALESCE(SUM(amount), 0) AS daily_total
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY sale_date
ORDER BY sale_date;
ความแตกต่าง IFNULL vs COALESCE
| คุณสมบัติ | IFNULL | COALESCE |
|---|---|---|
| Standard | MySQL Specific | ANSI SQL Standard |
| Arguments | 2 arguments เท่านั้น | Multiple arguments (2+) |
| Portability | MySQL Only | Cross-Database |
| Performance | เร็วกว่าเล็กน้อย | คล้ายกัน |
ตัวอย่าง COALESCE หลาย Arguments
-- คืนค่าแรกที่ไม่ใช่ NULL
SELECT COALESCE(NULL, NULL, 'default', 'fallback');
-- ผลลัพธ์: 'default'
-- ใช้ในคำนวณ
SELECT COALESCE(SUM(sales), 0) + COALESCE(SUM(returns), 0) AS net_sales
FROM daily_report;
Best Practice
- ✅ ใช้ COALESCE เป็นหลัก (Standard, ยืดหยุ่น)
- ✅ ใช้ IFNULL เฉพาะ Logic เรียบง่าย 2 ค่า
- ✅ ตั้ง Default Value ใน Schema:
amount DECIMAL(10,2) DEFAULT 0 - ✅ ใช้
IFNULL/COALESCEรอบนอก Aggregate Function (SUM, AVG, COUNT)