表示版本号的字符串之间的SQL查询
我有一个SQL查询,如下所示:表示版本号的字符串之间的SQL查询,sql,Sql,我有一个SQL查询,如下所示: select v FROM v.rsversion between 'minVer' and 'maxVer'; 其中,版本表示为格式为x.y.z的字符串 这将返回0.2.0和0.2.9之间的所有现有版本 但如果范围为0.2.0和0.2.10,则将不返回任何内容 有没有办法让这一切顺利进行 之所以不能按设计工作,是因为0.2.0和0.2.x不是文字数字,所以如果要进行字符串比较,它会查看每个递增字符并进行比较 所以0.2.0,0.2.1,0.2.10,0.2.2
select v FROM v.rsversion between 'minVer' and 'maxVer';
其中,版本表示为格式为x.y.z的字符串
这将返回0.2.0和0.2.9之间的所有现有版本
但如果范围为0.2.0和0.2.10,则将不返回任何内容
有没有办法让这一切顺利进行 之所以不能按设计工作,是因为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,这样就可以实现这一目的。之所以不能按设计工作,是因为0.2.0和0.2.x不是文字数字,因此,如果您试图进行字符串比较,它将查看每个递增的字符并进行比较 所以0.2.0,0.2.1,0.2.10,0.2.2,0.2.3,等等是如何排列弦的
您可以通过将前导0添加到字符串0.2.00、0.2.01、0.2.02等的第三部分来完成此操作,前提是您可以这样做。这是否有效?我假设您的版本将始终采用类似的格式,并且您的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的名称…这有用吗?我假设您的版本将始终采用类似的格式,并且您的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的名称…对于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示例:对于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示例:我建议将版本号存储在主版本、次版本、构建版本和修订版本的单独字段中。然后,您可以进行实际的数字比较,尽管有点棘手。0.2.0.0或其他版本基本上只是一种显示格式,应该从版本字段中计算出来。您使用的是什么数据库?为问题添加相应的标记。在SQL Server中,您可以使用内置的PARSENAME函数来解析格式为w.x.y.z的字符串,但最好将数值存储在单独的列中。是的,看起来最好的方法是将版本号存储在主、次、内部和版本的单独字段中。因为我必须更新我的模式,所以我会这样做。您使用的是哪种数据库管理系统?@jdl134679:如果您将版本设置为三个数字,那么数字比较就没有那么棘手了:where major、minor、patch介于0,2,1和0,2,11之间。我建议将版本号存储在major、minor、Build和Rev的单独字段中。然后,您可以进行实际的数字比较,尽管有点棘手。0.2.0.0或其他版本基本上只是一种显示格式,应该从版本字段中计算出来。您使用的是什么数据库?为问题添加相应的标记。在SQL Server中,您可以使用内置的PARSENAME函数来解析格式为w.x.y.z的字符串,但最好将数值存储在单独的列中。是的,看起来最好的方法是将版本号存储在主、次、内部和版本的单独字段中。因为我必须更新我的模式,所以我会这样做。您使用的是哪种数据库管理系统?@jdl134679:如果您将版本设置为三个数字,那么数字比较其实并不复杂:其中主、次、0,2,1和0,2,11Thanx之间的补丁,这非常好!Thanx,这太棒了!