Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL เงื่อนไขสองอย่างสำหรับคอลัมน์เดียว: กัน NULL และ Empty String

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