表示版本号的字符串之间的SQL查询

时间:2016-03-11 04:11:19

标签: sql

我有一个SQL查询,如下所示:

select v FROM v.rsversion between 'minVer' and 'maxVer';

version表示为格式x.y.z

的字符串

这将使所有现有版本在0.2.0和0.2.9之间恢复正常 但如果范围是0.2.0和0.2.10

,则不会返回任何内容

有没有办法让这项工作?

3 个答案:

答案 0 :(得分:0)

这不符合设计的原因是因为0.2.0和0.2.x不是文字数字,所以如果你试图进行字符串比较,它会查看每个递增的字符并进行比较。

所以0.2.0,0.2.1,0.2.10,0.2.2,0.2.3等是如何排列字符串的。

你可以通过在字符串0.2.00,0.2.01,0.2.02等的第三部分添加前导0来完成这项工作,如果可以为你的目的做的话。

答案 1 :(得分:0)

这有用吗?我假设您的版本将始终采用相似的格式,并且您的minVer和maxVer将以文本形式存储。

WITH
DATA AS
(
SELECT  whatever other data you require,
    SUBSTRING(v.rsversion FROM '^[0-9]+.[0-9]+'), '.', '')::decimal     as version_part_one,
    SUBSTRING(v.rsversion FROM '[0-9]+$')::decimal              as version_part_two

FROM    v
)

SELECT  d.whatever other data you require

FROM    data d

    WHERE   d.version_part_one >= SUBSTRING(minVer FROM '^[0-9]+.[0-9]+')::decimal
    AND
    d.version_part_two >= SUBSTRING(minVer FROM '.[0-9]+$')::decimal
    AND
    d.version_part_one <= SUBSTRING(minVer FROM '^[0-9]+.[0-9]+')::decimal
    AND
    d.version_part_two <= SUBSTRING(maxVer FROM '.[0-9]+$')::decimal

如果您感觉更有创意,可以更改CTE的名称......

答案 2 :(得分:0)

使用Postgres,您可以通过将版本拆分为三个数字然后比较这些数字来实现。对于其他DBMS,您需要找到一种将0.2.1之类的字符串拆分为三个数字的不同方法。

with rsversion (v) as (
  values 
     -- only here for sample data
     ('0.2.0'), ('0.2.1'), ('0.2.2'), ('0.2.10'), ('0.2.12'), 
     ('0.3.0'), ('0.3.1'), ('0.3.2'), ('0.3.4')
), numeric_version (v, major, minor, patch) as (
  select v, 
         split_part(v,'.', 1)::int, 
         split_part(v,'.', 2)::int, , 
         split_part(v,'.', 3)::int
   from rsversion
)
select v 
FROM numeric_version 
where (major,minor,patch) between (0,2,1) and (0,2,11)

以上版画:

v     
------
0.2.1 
0.2.2 
0.2.10

SQLFiddle示例:http://sqlfiddle.com/#!15/403d2/2