我有一个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
,则不会返回任何内容有没有办法让这项工作?
答案 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