Натуральная сортировка

Бывают ситуации, когда из базы данных необходимо вывести в выпадающем списке номера домов, причем отсортировать их по возрастанию. Номер дома может содержать не только цифры, но и другие символы, например, 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;

Надеюсь для кого-то данная статья будет полезной и он сэкономит время