Бывают ситуации, когда из базы данных необходимо вывести в выпадающем списке номера домов, причем отсортировать их по возрастанию. Номер дома может содержать не только цифры, но и другие символы, например, 10а или 11/1. А значит это уже не числовой тип, а текстовый. Соответственно и сортировка в SQL-запросе по этому полю будет происходить не как числа, а как текста. Таким образом, вывод значений из базы данных будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 | 1 11 12а 13б 20а 21/1 22 30 |
и так далее…
Как видите, это не тот результат, который мы бы хотели видеть. Так как же сделать, чтобы номера домов в списке были отсортированы не посимвольно? После долгих поисков в рунете, чтения мануалов и собственных исследований, были найдены решения для SQLite и Firebird 2.5 и выше.
SQLite
1 | SELECT NUMBER FROM addresses ORDER BY NUMBER+0 |
Firebird
1 2 | CREATE collation ns_coll FOR utf8 FROM unicode CASE insensitive 'NUMERIC-SORT=1'; ALTER TABLE addresses ADD NUMBER VARCHAR(100) CHARACTER SET utf8 COLLATE ns_coll; |
Надеюсь для кого-то данная статья будет полезной и он сэкономит время