Filter ออก NULL และ Empty String ('') พร้อมกัน
ใน SQL: NULL ≠ '' (Empty String) ต้องเช็คทั้งคู่
ตัวอย่างข้อมูลมี NULL และ Empty
CREATE TABLE DemoTable635 (
EmployeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(100)
);
INSERT INTO DemoTable635(EmployeeName) VALUES
('John'), ('Sam'), (''), (NULL), ('David');
Query: แสดงเฉพาะที่มีชื่อจริง (ไม่ NULL, ไม่ Empty)
SELECT * FROM DemoTable635
WHERE EmployeeName IS NOT NULL
AND EmployeeName <> '';
ผลลัพธ์: John, Sam, David
+-----------+--------------+
| EmployeId | EmployeeName |
+-----------+--------------+
| 1 | John |
| 2 | Sam |
| 5 | David |
+-----------+----------------+
วิธีลดรูป: ใช้ COALESCE หรือ IFNULL
-- COALESCE: คืนค่า Non-NULL แรก
WHERE COALESCE(EmployeeName, '') <> ''
-- IFNULL (MySQL Specific)
WHERE IFNULL(EmployeeName, '') <> ''
-- หรือ LENGTH/TRIM
WHERE LENGTH(TRIM(EmployeeName)) > 0
⚠️ NULL Comparison Trap
-- ผลลัพธ์ทั้งคู่เป็น UNKNOWN (ไม่ใช่ TRUE/FALSE)
NULL = '' -- UNKNOWN
NULL <> '' -- UNKNOWN
NULL = NULL -- UNKNOWN
'' = '' -- TRUE
-- ต้องใช้ IS NULL / IS NOT NULL
WHERE EmployeeName IS NOT NULL -- TRUE สำหรับ '', FALSE สำหรับ NULL
WHERE EmployeeName = '' -- TRUE สำหรับ '', UNKNOWN สำหรับ NULL
Best Practice: Constraint ป้องกันที่ Schema Level
-- NOT NULL + CHECK Constraint (MySQL 8.0.16+)
CREATE TABLE employees (
EmployeeName VARCHAR(100) NOT NULL,
CHECK (TRIM(EmployeeName) <> '')
);
-- หรือ Trigger (MySQL 5.7+)
CREATE TRIGGER check_name_not_empty
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF NEW.EmployeeName IS NULL OR TRIM(NEW.EmployeeName) = '' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'EmployeeName cannot be empty';
END IF;
END;
Data Cleaning: Update Empty → NULL (Normalize)
UPDATE DemoTable635
SET EmployeeName = NULL
WHERE EmployeeName = '';
แล้วแค่เช็ค WHERE EmployeeName IS NOT NULL ก็พอ
Application Level Validation
ควร Validate ก่อน Insert (Frontend + Backend):
- Trim Input
- Check Empty
- Check Length
- Sanitize Special Chars