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

เรียงลำดับตัวเลขที่เก็บเป็น VARCHAR (มีเลข 0 นำหน้า) ใน MySQL ให้ถูกต้อง

การเรียงตัวเลขใน VARCHAR ให้ถูกต้องตามค่าตัวเลขจริง

เมื่อตัวเลขเก็บใน VARCHAR และมีเลข 0 นำหน้า (Leading zeros) เช่น '085', '090' การเรียงแบบสตริง (Alphabetical) จะผิด (090 จะอยู่ก่อน 85) วิธีแก้คือคูณด้วย 1 เพื่อแปลงเป็นตัวเลขใน ORDER BY

สร้างตารางและเพิ่มข้อมูล

mysql> CREATE TABLE DemoTable (Value VARCHAR(100));
Query OK, 0 rows affected (0.62 sec)

mysql> INSERT INTO DemoTable VALUES('90');
mysql> INSERT INTO DemoTable VALUES('86');
mysql> INSERT INTO DemoTable VALUES('45');
mysql> INSERT INTO DemoTable VALUES('85');
mysql> INSERT INTO DemoTable VALUES('085');
mysql> INSERT INTO DemoTable VALUES('090');
mysql> INSERT INTO DemoTable VALUES('045');

แสดงข้อมูลทั้งหมด (ลำดับ Insert)

mysql> SELECT * FROM DemoTable;

ผลลัพธ์:

+-------+
| Value |
+-------+
| 90    |
| 86    |
| 45    |
| 85    |
| 085   |
| 090   |
| 045   |
+-------+
7 rows in set (0.00 sec)

คำสั่งเรียงตามค่าตัวเลขจริง (คูณ 1) แล้วตามสตริงต้นฉบับ

mysql> SELECT * FROM DemoTable ORDER BY Value * 1, Value;

ผลลัพธ์:

+-------+
| Value |
+-------+
| 045   |
| 45    |
| 085   |
| 85    |
| 86    |
| 090   |
| 90    |
+-------+
7 rows in set (0.00 sec)

คำอธิบาย

  • Value * 1 : บังคับให้ MySQL แปลง VARCHAR เป็น Number เพื่อเรียง (Numeric Sort)
  • Value : ใช้เป็น Tie-breaker เมื่อค่าตัวเลขเท่ากัน (045 และ 45 เท่ากัน 45) เรียงตามสตริงต้นฉบับ → '045' ก่อน '45'
  • ผลลัพธ์: 45, 85, 86, 90 พร้อม Leading zero version อยู่ก่อนค่าปกติ
  • วิธีนี้ใช้ได้กับคอลัมน์ VARCHAR ที่เก็บตัวเลขเท่านั้น