เมื่อ CONCAT() พบค่า NULL ในอาร์กิวเมนต์ใดก็ตาม ผลลัพธ์จะเป็น NULL ทั้งหมด ต้องใช้ IFNULL() หรือ COALESCE() แทนที่ NULL ด้วยสตริงว่าง '' ก่อน
ตัวอย่างปัญหาและวิธีแก้
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1793 (
StudentFirstName VARCHAR(20),
StudentLastName VARCHAR(20)
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล (มี NULL)
mysql> INSERT INTO DemoTable1793 VALUES('John', 'Smith');
mysql> INSERT INTO DemoTable1793 VALUES('Carol', NULL);
mysql> INSERT INTO DemoTable1793 VALUES(NULL, 'Brown');
3. แสดงข้อมูลเดิม
mysql> SELECT * FROM DemoTable1793; +------------------+-----------------+ | StudentFirstName | StudentLastName | +------------------+-----------------+ | John | Smith | | Carol | NULL | | NULL | Brown | +------------------+-----------------+
4. ❌ CONCAT ธรรมดา (ผลลัพธ์เป็น NULL)
mysql> SELECT CONCAT(StudentFirstName, StudentLastName) FROM DemoTable1793; +------------------------------------------------+ | CONCAT(StudentFirstName, StudentLastName) | +------------------------------------------------+ | JohnSmith | | NULL | -- Carol + NULL = NULL | NULL | -- NULL + Brown = NULL +------------------------------------------------+
5. ✅ ใช้ IFNULL() แทนที่ NULL ด้วย ''
mysql> SELECT CONCAT(IFNULL(StudentFirstName, ''), IFNULL(StudentLastName, ''))
FROM DemoTable1793;
6. ผลลัพธ์ที่ถูกต้อง
+----------------------------------------------------------------+ | CONCAT(IFNULL(StudentFirstName,''), IFNULL(StudentLastName,'')) | +----------------------------------------------------------------+ | JohnSmith | | Carol | | Brown | +----------------------------------------------------------------+
ฟังก์ชันจัดการ NULL
| ฟังก์ชัน | คำอธิบาย | ตัวอย่าง |
|---|---|---|
IFNULL(expr, val) | MySQL Specific: ถ้า expr IS NULL คืน val | IFNULL(NULL, '') = '' |
COALESCE(val1, val2, ...) | ANSI Standard: คืนค่าแรกที่ NOT NULL | COALESCE(NULL, '', 'fallback') = '' |
NULLIF(val1, val2) | คืน NULL ถ้า val1 = val2 | NULLIF('', ' ') = NULL |
แนะนำ: ใช้ CONCAT_WS (Concatenate With Separator)
-- ข้าม NULL อัตโนมัติ ไม่ต้อง IFNULL
SELECT CONCAT_WS(' ', StudentFirstName, StudentLastName) FROM DemoTable1793;
-- ผลลัพธ์: 'John Smith', 'Carol', 'Brown'
สรุป
CONCAT() จะคืน NULL ถ้ามีอาร์กิวเมนต์ NULL ใดๆ ใช้ IFNULL(col, '') หรือ COALESCE(col, '') แทนที่ NULL ก่อน CONCAT หรือใช้ CONCAT_WS(sep, ...) ซึ่งข้าม NULL อัตโนมัติและใส่ Separator ให้