การเรียง sql order ตัวเลขแบบมนุษย์

ปกติแล้วเวลาที่เราเขียนคำสั่ง sql ให้เรียงตามมากไปน้อย หรือ น้อยไปมาก เช่น

"SELECT * FROM `products` ORDER BY `id` ASC"

หากช่องเก็บ id เป็น integer ผลลัพธ์จะออกมาเป็น 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23

มัน ไม่เรียงตามจำนวนจากมากไปน้อย เนื่องจาก computer มันเรียงของมันอย่างนั้น (หากย้อนไป windows ยุคเก่าๆมันก็เรียงอย่างนี้เหมือนกัน)

ซึ่งทั้งๆที่เราระบุไว้แล้วว่าเรียงจากน้อยไปมาก (asc)

วิธีแก้

เพิ่ม abs() เข้าไปใน field ที่จะสั่งให้เรียง เช่น

"SELECT * FROM `products` ORDER BY ABS(id) ASC"

ซึ่ง ABS() นี้ก็คือ absolute value หรือค่าจริงนี่เอง (อ้างอิงจาก http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html)

คราว นี้ผลลัพธ์ที่จะออกมาก็ควรจะเป็น 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 ตามการเรียงเลขแบบที่มนุษย์เข้าใจ

เทคนิคนี้สามารถใช้ได้ทั้ง microsoft sql และ mysql

 

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>