Core, совместимый с ANSI SQL-99:
select * from product
order by cast(version as int),
cast(substring(version from position('.' in version) + 1) as int);
Т.е. сначала сортировка по целой части.Затем выполните сортировку по «целому числу» после символа .
.
Выполняется как:
SQL>create table product (version varchar(10), name varchar(10));
SQL>insert into product values ('1.8', 'Bar');
SQL>insert into product values ('12.23', 'Foo');
SQL>insert into product values ('23.15', 'Hello');
SQL>insert into product values ('1.11', 'Bye');
SQL>select * from product
SQL&order by cast(version as int),
SQL& cast(substring(version from position('.' in version) + 1) as int);
version name
========== ==========
1.8 Bar
1.11 Bye
12.23 Foo
23.15 Hello
4 rows found
Обратите внимание, что некоторые продукты имеют свои собственные версии ANSI SQL substring()
и position()
,Если у вас возникли проблемы, попробуйте substr(version, value)
и т. Д.
EDIT : (приведение (версия как int) завершится ошибкой в SQL Server (и Postgres) для строк, содержащих десятичные дроби -a_horse_with_no_name) Убедитесь, что вы используете только целую часть как целое число:
select * from product
order by cast(substring(version from 1 for position('.' in version) -1) as int),
cast(substring(version from position('.' in version) + 1) as int);