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

ลบ/ซ่อนฟิลด์เฉพาะและแสดงข้อมูลอื่นใน MySQL ด้วย CASE WHEN

สถานการณ์: แสดงนามสกุลถ้าชื่อเป็น John, มิฉะนั้นแสดงชื่อ

ใช้ CASE WHEN ใน SELECT เพื่อคืนค่าตามเงื่อนไข

ไวยากรณ์

SELECT CASE 
    WHEN condition THEN result1
    ELSE result2
END AS alias
FROM yourTable
WHERE filter_condition;

ตัวอย่าง: ตาราง demo47

CREATE TABLE demo47 (
    first_name VARCHAR(20),
    last_name VARCHAR(20)
);

INSERT INTO demo47 VALUES
('John', 'Smith'), ('David', 'Miller'),
('John', 'Doe'), ('Chris', 'Brown');

ข้อมูล

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| John       | Smith     |
| David      | Miller    |
| John       | Doe       |
| Chris      | Brown     |
+------------+-----------+

คำสั่ง: กรองเฉพาะแถวที่มี 'John' ใน first_name หรือ last_name แล้วแสดง last_name ถ้าเป็น John มิฉะนั้น first_name

SELECT CASE 
    WHEN first_name = 'John' THEN last_name
    ELSE first_name
END AS Result
FROM demo47
WHERE 'John' IN (first_name, last_name);

ผลลัพธ์

+--------+
| Result |
+--------+
| Smith  |
| Doe    |
+--------+

คำอธิบาย

  • WHERE 'John' IN (first_name, last_name): กรองเฉพาะแถวที่มี 'John' อยู่ใน first_name หรือ last_name (ได้แถวที่ 1 และ 3)
  • CASE WHEN first_name = 'John' THEN last_name ELSE first_name END: แถวที่ 1 (John Smith) → Smith, แถวที่ 3 (John Doe) → Doe

รูปแบบ CASE WHEN ทั้งหมด

Simple CASE (เปรียบเทียบค่าเดียว)

CASE column
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ELSE default_result
END

Searched CASE (เงื่อนไขซับซ้อน)

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ELSE default_result
END

กรณีศึกษา: แทนค่า NULL

SELECT 
    COALESCE(first_name, 'Unknown') AS name,
    CASE 
        WHEN last_name IS NULL THEN 'No Last Name'
        ELSE last_name
    END AS last_name_display
FROM demo47;

การ UPDATE ด้วย CASE WHEN

UPDATE demo47
SET first_name = CASE
    WHEN first_name = 'John' THEN 'Jonathan'
    WHEN first_name = 'Bob' THEN 'Robert'
    ELSE first_name
END;