Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表示版本号的字符串之间的SQL查询_Sql - Fatal编程技术网

表示版本号的字符串之间的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

我有一个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,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,这太棒了!