ภาพรวม
ใช้ COALESCE() เลือกค่าคอลัมน์แรกที่ไม่ใช่ NULL จากรายการคอลัมน์/ค่าที่ระบุ
ไวยากรณ์
COALESCE(col1, col2, col3, ..., default_value)
-- คืนค่าแรกที่ไม่ใช่ NULL
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล (มี NULL ในคอลัมน์ต่างกัน)
CREATE TABLE DemoTable1470 (
FirstName VARCHAR(20),
Age INT
);
INSERT INTO DemoTable1470 VALUES ('Robert', 23);
INSERT INTO DemoTable1470 VALUES ('Bob', NULL);
INSERT INTO DemoTable1470 VALUES (NULL, 25);
2. ข้อมูลทั้งหมด
SELECT * FROM DemoTable1470;
+-----------+------+
| FirstName | Age |
+-----------+------+
| Robert | 23 |
| Bob | NULL |
| NULL | 25 |
+-----------+------+
3. COALESCE(FirstName, Age) - เลือก FirstName ถ้า NULL ให้ Age
SELECT COALESCE(FirstName, Age) AS FirstNameOrAgeValue
FROM DemoTable1470;
4. ผลลัพธ์
+---------------------+
| FirstNameOrAgeValue |
+---------------------+
| Robert | -- FirstName ไม่ NULL
| Bob | -- FirstName ไม่ NULL (Age เป็น NULL แต่ไม่ได้ใช้)
| 25 | -- FirstName เป็น NULL → ใช้ Age
+---------------------+
การประยุกต์ใช้จริง
1. Fallback Chain: Phone → Email → 'No Contact'
SELECT COALESCE(Phone, Email, 'No Contact') AS Contact
FROM Customers;
2. คำนวณค่า Default ใน Expression
SELECT
ProductName,
COALESCE(DiscountPrice, Price, 0) AS FinalPrice
FROM Products;
3. ใน UPDATE (ตั้งค่า Default)
UPDATE Users
SET LastLogin = COALESCE(LastLogin, '1970-01-01')
WHERE LastLogin IS NULL;
COALESCE vs IFNULL vs CASE
| ฟังก์ชัน | Argument | Standard | ใช้เมื่อ |
|---|---|---|---|
| COALESCE(a,b,c...) | 2+ | ANSI SQL | หลาย Fallback, Portable |
| IFNULL(a,b) | 2 | MySQL Only | แค่ 2 ค่า สั้นกว่า |
| CASE WHEN a IS NULL THEN b ELSE a END | - | ANSI SQL | Logic ซับซ้อน |
ข้อควรระวัง
- Data Type ของทุก Argument ควรเข้ากันได้ (MySQL จะ Convert อัตโนมัติ)
- COALESCE(FirstName, Age) → FirstName เป็น VARCHAR, Age เป็น INT → ผลลัพธ์เป็น VARCHAR (Number แปลงเป็น String)
- ทุก Argument เป็น NULL → คืน NULL
สรุป
ใช้ COALESCE(col1, col2, ...) เลือกค่าคอลัมน์แรกที่ไม่ใช่ NULL สำหรับ Fallback, Default Value, หรือรวมคอลัมน์สำรอง