ใช้ CAST(column AS SIGNED) หรือ CAST(column AS UNSIGNED) แปลง VARCHAR เป็นตัวเลขก่อนเปรียบเทียบ
ตัวอย่างการใช้งาน
1. สร้างตารางเก็บคะแนนเป็น VARCHAR
mysql> create table DemoTable (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentScore varchar(100)
-> );
mysql> insert into DemoTable(StudentScore) values('90'), ('100'), ('56'), ('98');
2. เปรียบเทียบด้วย CAST AS SIGNED
mysql> SELECT * FROM DemoTable WHERE CAST(StudentScore AS SIGNED) > 91;
ผลลัพธ์ (ได้ 100 และ 98)
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 2 | 100 | | 4 | 98 | +-----------+--------------+
ชนิดข้อมูลเป้าหมายใน CAST
| Type | ช่วงค่า | ใช้เมื่อ |
|---|---|---|
SIGNED | -2147483648 ถึง 2147483647 | มีค่าลบได้ |
UNSIGNED | 0 ถึง 4294967295 | แค่ค่าบวก |
DECIMAL(m,d) | ทศนิยมแม่นยำ | เงิน, คะแนนทศนิยม |
DOUBLE | จำนวนจริง | คำนวณวิทยาศาสตร์ |
วิธีอื่น: การแปลงโดยนำหน้าด้วย 0
SELECT * FROM DemoTable WHERE (StudentScore + 0) > 91;
ข้อดี: เขียนสั้น, ใช้ Index ได้หากคอลัมน์มี Index (MySQL 8.0+)
ข้อควรระวัง
- ค่าที่แปลงไม่ได้ (เช่น 'abc') จะกลายเป็น 0 พร้อม Warning
- การใช้ฟังก์ชันบนคอลัมน์ (
CAST(col)) ทำให้ไม่ใช้ Index ได้ → ควรสร้าง Generated Column + Index