สร้างตารางมีคอลัมน์ ENUM
mysql> create table DemoTable1992 ( ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY, ClientName varchar(20), isActive ENUM('Y','N') );
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable1992(ClientName,isActive) values('Chris','N');
mysql> insert into DemoTable1992(ClientName,isActive) values('Bob','N');
mysql> insert into DemoTable1992(ClientName,isActive) values('David','Y');
mysql> insert into DemoTable1992(ClientName,isActive) values('Carol','N');
ข้อมูลในตาราง
+----------+------------+----------+ | ClientId | ClientName | isActive | +----------+------------+----------+ | 1 | Chris | N | | 2 | Bob | N | | 3 | David | Y | | 4 | Carol | N | +----------+------------+----------+
Query แสดงข้อความกำหนดเองด้วย IF
mysql> select ClientName, if(isActive='Y','Active Member','Not Active Member') as Result from DemoTable1992;
ผลลัพธ์
+------------+-------------------+ | ClientName | Result | +------------+-------------------+ | Chris | Not Active Member | | Bob | Not Active Member | | David | Active Member | | Carol | Not Active Member | +------------+-------------------+
อธิบาย
ENUM('Y','N')จำกัดค่าได้แค่ 'Y' หรือ 'N' (และ NULL หากไม่ได้ NOT NULL)IF(condition, true_value, false_value)ฟังก์ชันควบคุมเงื่อนไขแบบ Inline- คอลัมน์
Resultเป็นคำนวณ (Computed) ไม่ได้เก็บในตาราง
รูปแบบ CASE WHEN (มาตรฐาน SQL)
SELECT ClientName,
CASE isActive
WHEN 'Y' THEN 'Active Member'
WHEN 'N' THEN 'Not Active Member'
ELSE 'Unknown Status'
END AS Result
FROM DemoTable1992;
ข้อดีของ CASE WHEN
- รองรับเงื่อนไขมากกว่า 2 เงื่อนไข
- เป็น SQL Standard ทำงานได้ทุก Database
- อ่านง่ายกว่า IF 巢狀 (Nested IF)
แนะนำ: ใช้ Generated Column (MySQL 5.7+)
ALTER TABLE DemoTable1992
ADD COLUMN StatusLabel VARCHAR(20)
GENERATED ALWAYS AS (
CASE isActive
WHEN 'Y' THEN 'Active Member'
ELSE 'Not Active Member'
END
) VIRTUAL;
คอลัมน์ StatusLabel จะคำนวณอัตโนมัติเมื่อ SELECT ไม่ต้องเขียน IF ทุกครั้ง
เกี่ยวกับ ENUM
- เก็บข้อมูลเป็นตัวเลข Index (1, 2, ...) ประหยัดพื้นที่
- แก้ไขค่า ENUM ต้อง
ALTER TABLE(ยุ่งยาก) - ควรพิจารณาใช้
TINYINT+CHECK CONSTRAINT(MySQL 8.0.16+) หรือ Lookup Table แทน เพื่อความยืดหยุ่น