ปัญหาการเปรียบเทียบตัวเลขที่เก็บเป็น VARCHAR
เมื่อตัวเลขถูกเก็บเป็น VARCHAR การใช้ MAX() โดยตรงจะเปรียบเทียบแบบ String (Lexicographical) ทำให้ '9' มากกว่า '10001'
วิธีแก้: ใช้ CAST() ร่วมกับ MAX()
SELECT MAX(CAST(column_name AS UNSIGNED))
FROM table_name;
ตัวอย่าง
CREATE TABLE DemoTable2030 (Value VARCHAR(20));
INSERT INTO DemoTable2030 VALUES ('8'), ('1'), ('10001'), ('901');
-- ผิด: เปรียบเทียบแบบ String
SELECT MAX(Value) FROM DemoTable2030; -- ได้ '901'
-- ถูก: แปลงเป็นตัวเลขก่อน
SELECT MAX(CAST(Value AS UNSIGNED)) FROM DemoTable2030; -- ได้ 10001
ผลลัพธ์ที่ถูกต้อง
| MAX(CAST(Value AS UNSIGNED)) |
|---|
| 10001 |
ประเภทข้อมูลที่ใช้ CAST ได้: UNSIGNED, SIGNED, DECIMAL, DATE, DATETIME, CHAR, BINARY