база данных: портативный способ сравнить два номера версии? - PullRequest
0 голосов
/ 04 октября 2018

Что такое кроссплатформенный синтаксис для сравнения двух номеров версий?Версия состоит из двух частей: основной версии и вспомогательной версии, обе являются целочисленными.

Чтобы сравнить две версии, сначала сравните их основные версии.Если основные версии совпадают, сравните их второстепенные версии.

Например,

Product Table:

version  name
--------------
1.8      Bar
12.23    Foo
23.15    Hello

SQL

Select * from Product where version < "5.12"

Должна быть возвращена первая строка с версией 1.8.Существует ли какой-либо синтаксис sql, который будет работать на разных платформах SQL?

В частности, я бы хотел, чтобы это работало на следующих платформах:

  • oracle
  • mysql
  • SQL-сервер
  • sqlite

1 Ответ

0 голосов
/ 04 октября 2018

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);
...