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

หาแถวที่มี NULL ในคอลัมน์ใดคอลัมน์หนึ่งด้วย GREATEST ใน MySQL

การเตรียมข้อมูล

mysql> CREATE TABLE DemoTable1862 (
    Value1 INT, Value2 INT, Value3 INT, Value4 INT
);

mysql> INSERT INTO DemoTable1862 VALUES(43, 34, 56, 42);
mysql> INSERT INTO DemoTable1862 VALUES(NULL, 78, 65, NULL);
mysql> INSERT INTO DemoTable1862 VALUES(110, NULL, 78, NULL);

ข้อมูลในตาราง

+--------+--------+--------+--------+
| Value1 | Value2 | Value3 | Value4 |
+--------+--------+--------+--------+
|     43 |     34 |     56 |     42 |
|   NULL |     78 |     65 |   NULL |
|    110 |   NULL |     78 |   NULL |
+--------+--------+--------+--------+

ใช้ GREATEST หาแถวที่มี NULL อย่างน้อย 1 คอลัมน์

mysql> SELECT * FROM DemoTable1862
    WHERE GREATEST(Value1, Value2, Value3, Value4) IS NULL;

ผลลัพธ์ (แถวที่ 2 และ 3 มี NULL):

+--------+--------+--------+--------+
| Value1 | Value2 | Value3 | Value4 |
+--------+--------+--------+--------+
|   NULL |     78 |     65 |   NULL |
|    110 |   NULL |     78 |   NULL |
+--------+--------+--------+--------+

หลักการทำงาน

  • GREATEST() คืนค่าสูงสุดจากรายการ
  • ถ้ามี NULL ใดๆ ในพารามิเตอร์ → คืนค่า NULL
  • ดังนั้น GREATEST(...) IS NULL = มี NULL อย่างน้อย 1 ตัว

วิธีอื่นที่อ่านง่ายกว่า

-- ใช้ OR ตรวจสอบทีละคอลัมน์ (ชัดเจนกว่า)
WHERE Value1 IS NULL OR Value2 IS NULL OR Value3 IS NULL OR Value4 IS NULL

-- ใช้ COALESCE (ตรวจสอบว่าทุกคอลัมน์เป็น NULL)
WHERE COALESCE(Value1, Value2, Value3, Value4) IS NULL  -- ทุกคอลัมน์ NULL

-- MySQL 8.0+ ใช้ JSON_CONTAINS (ถ้าเป็น JSON)
-- WHERE JSON_CONTAINS(CAST(ROW(Value1,Value2,Value3,Value4) AS JSON), CAST(NULL AS JSON))

ข้อควรระวัง

  • GREATEST และ LEAST คืน NULL ถ้ามี NULL อยู่ใน Arguments
  • พฤติกรรมนี้แตกต่างจากบาง DBMS (PostgreSQL: GREATEST ข้าม NULL)
  • สำหรับ String ใช้ GREATEST ได้เหมือนกัน (เปรียบเทียบ Lexicographically)