При розробці часто виникає задача сортування. Числа і рядки упорядковано по-різному - тут немає ніякої таємниці. Проблеми виникають, коли необхідно в текстовому полі зберігати числові дані. При сортуванні до чисел будуть застосовані правила рядків: після 1 буде 10, 11, 12 ... 19, 100. І лише після впорядкування всіх чисел, що починаються з 1, дійде черга до числа 2. Давайте розберемо приклад і методи вирішення проблеми.
У базі є таблиця address_home. в якій зберігаються номери будинків. Номери будинків, крім цифр самого номера будинку, можуть містити інформацію про корпусі, будову і т д ... Для спрощення пошуку було прийнято рішення не відокремлювати номер в окреме поле. Тобто, зберігати номер будинку як рядок.
В результаті при сортуванні отримуємо аномалію, описану на початку статті:
SELECT name FROM address_home ORDER BY name LIMIT 10 + ------ + | name | + ------ + | 1 | | 10 | | 10/1 | | 10/2 | | 11 | | 12 | | 13 | | 18 | | 19 | | 19а | | 100 | + ------ +
Щоб виправити сортування, проведемо одну хитру маніпуляцію:
SELECT name, CAST (name AS UNSIGNED) AS name2 FROM address_home ORDER BY name2, name LIMIT 10 + ------ + | name | + ------ + | 1 | | 2 | | 3 | | 4 | | 5 | | 5а | | 5б | | 6 | | 7 | | 8 | | 9 | + ------ +
Функція CAST використовується для приведення поля до іншого типу, в нашому випадку - до числовому. За створеному полю виробляємо сортування. Щоб корпусу та будівлі сортувалися в потрібному порядку, додаємо сортування по полю name.
Рішення наведено лише для ознайомлення. При великих навантаженнях використовувати таке не рекомендується зважаючи на повну сканування таблиці (навіть при використанні індексу).