数据库:可移植的方式来比较两个版本号?

时间:2018-10-03 22:31:18

标签: sql string-function

比较两个版本号的跨平台语法是什么?一个版本有两个部分:主要版本和次要版本,它们都是整数。

要比较两个版本,请首先比较它们的主要版本。如果主要版本相同,请比较其次要版本。

例如,

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 :(得分:0)

符合核心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)等。

编辑(对于包含小数的字符串,在SQL Server(和Postgres)中,cast(版本为int)将失败– 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);