ภาพรวม
ใน Stored Procedure ตัวแปร Local (DECLARE) ที่ไม่ได้กำหนดค่า จะมีค่าเป็น NULL ใช้ COALESCE() เพื่อตรวจสอบและแทนค่า Default
ฟังก์ชัน COALESCE()
COALESCE(value1, value2, ..., default_value)
-- คืนค่าแรกที่ไม่ใช่ NULL
ตัวอย่าง Stored Procedure
1. สร้าง Procedure
DELIMITER //
CREATE PROCEDURE local_VariableDemo()
BEGIN
DECLARE value1 INT;
DECLARE value2 INT;
-- แสดงค่าเริ่มต้น (NULL)
SELECT value1, value2;
-- ใช้ COALESCE แทน NULL ด้วย 0 แล้วบวกกัน
SELECT CONCAT('After checking local variable is null the sum = ',
COALESCE(value1, 0) + COALESCE(value2, 0)) AS Result;
END //
DELIMITER ;
2. เรียกใช้ Procedure
CALL local_VariableDemo();
3. ผลลัพธ์
+--------+--------+
| value1 | value2 |
+--------+--------+
| NULL | NULL |
+--------+--------+
+------------------------------------------------------------------+
| Result |
+------------------------------------------------------------------+
| After checking local variable is null the sum is = 0 |
+------------------------------------------------------------------+
การประยุกต์ใช้จริง
1. ตั้งค่า Default ให้ Parameter
CREATE PROCEDURE GetUser(IN userId INT, IN limitRows INT)
BEGIN
SET limitRows = COALESCE(limitRows, 10); -- Default 10
SELECT * FROM Users WHERE Id = userId LIMIT limitRows;
END;
2. คำนวณค่ารวม โดยถือ NULL เป็น 0
SELECT
COALESCE(SUM(Price), 0) AS TotalRevenue,
COALESCE(AVG(Rating), 0) AS AvgRating
FROM Orders;
3. เลือกคอลัมน์สำรอง (Fallback)
SELECT COALESCE(Phone, Email, 'No Contact') AS ContactInfo
FROM Customers;
ฟังก์ชันเปรียบเทียบ
| ฟังก์ชัน | ใช้เมื่อไหร่ |
|---|---|
| COALESCE(a, b, c...) | คืนค่าแรกที่ไม่ NULL (หลายค่า) |
| IFNULL(a, b) | MySQL เฉพาะ 2 ค่า (a NULL → b) |
| IF(condition, a, b) | เงื่อนไขแบบกำหนดเอง |
| CASE WHEN ... THEN ... ELSE ... END | เงื่อนไขซับซ้อนหลายกรณี |
ข้อควรระวัง
COALESCEเป็น ANSI SQL Standard รองรับหลาย DatabaseIFNULLเป็น MySQL Specific ใช้ได้แค่ 2 Argument- ตัวแปร Local ใน Procedure ต้อง
DECLAREก่อนใช้
สรุป
ใช้ COALESCE(variable, default_value) ตรวจสอบและแทนค่า NULL ใน Stored Procedure ทำให้โค้ดสะอาด ไม่ต้องเขียน IF/ELSE ยาว