การใช้ CAST() เพื่อจัดเรียงตัวเลขที่เก็บเป็นข้อความ
เมื่อคอลัมน์ตัวเลขถูกเก็บเป็นชนิดข้อมูลข้อความ (VARCHAR/TEXT) การจัดเรียงด้วย ORDER BY แบบปกติจะใช้การเปรียบเทียบแบบสตริง ทำให้ได้ลำดับผิดพลาด (เช่น 100 จะอยู่ก่อน 11) แก้ไขได้โดยใช้ CAST() แปลงเป็นตัวเลขก่อนจัดเรียง
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score INT
);
เพิ่มข้อมูล:
INSERT INTO DemoTable (Score) VALUES (10), (100), (11), (97), (78), (89);
ข้อมูลก่อนจัดเรียง
+----+-------+ | Id | Score | +----+-------+ | 1 | 10 | | 2 | 100 | | 3 | 11 | | 4 | 97 | | 5 | 78 | | 6 | 89 | +----+-------+
คำสั่งจัดเรียง ASC ด้วย CAST()
SELECT * FROM DemoTable ORDER BY CAST(Score AS SIGNED INTEGER) ASC;
ผลลัพธ์หลังจัดเรียงถูกต้อง
+----+-------+ | Id | Score | +----+-------+ | 1 | 10 | | 3 | 11 | | 5 | 78 | | 6 | 89 | | 4 | 97 | | 2 | 100 | +----+-------+
คำอธิบาย: CAST(Score AS SIGNED INTEGER) แปลงค่าในคอลัมน์ Score ให้เป็นจำนวนเต็มที่มีเครื่องหมาย ก่อนนำไปจัดเรียง ทำให้ได้ลำดับตัวเลขที่ถูกต้องตามค่าตัวเลขจริง ไม่ใช่ลำดับตัวอักษร
เคล็ดลับ: หากคอลัมน์เป็นชนิดตัวเลขอยู่แล้ว (INT, DECIMAL, FLOAT) ไม่ต้องใช้ CAST() เพราะ MySQL จะจัดเรียงตามค่าตัวเลขโดยอัตโนมัติ