SQL Server:如何排序和比较许多版本?

问题描述 投票:1回答:2

在我对表的请求中,我必须找到版本小于或等于10.0.1703(<= 10.0.1703)的版本的所有行,并且有很多版本。我使用SQL Server。结果中所需的行的示例是:

enter image description here

id | name | build(version)
--------------------------
1  | A    | 10.0.1703
2  | B    | 6.3.9600

我必须找到所有旧版本或等于10.0.1703的版本。 6.3.9600小于10.0.1703

它与这个问题有关,但提供的解决方案对我来说很难理解How to compare software versions using SQL Server?

sql sql-server versioning
2个回答
5
投票

一种方式是施放为hierarchyid

WHERE CAST('/' + build + '/' AS HIERARCHYID) <= CAST('/10.0.1703/' AS HIERARCHYID) 

DEMO


0
投票

我同意@Larnu,如果您打算使用它进行比较而不仅仅是显示,那么您最好将这些值分开并单独存储。

但是鉴于你拥有的东西,在任何一种情况下,你仍然需要有一些逻辑来确定更大或更小。我喜欢PARSENAME(),然后你可以为类似于IP地址的版本构建一个数值。

鉴于此表和数据:

CREATE TABLE #x(id int NOT NULL, name char(1), build varchar(32));    

INSERT #x VALUES(1,'A','10.0.1703'),(2,'B','6.3.9600');

我们可以编写这样的查询(嵌套CTE只是为了避免多次运行PARSENAME()逻辑):

DECLARE @criteria varchar(32) = '10.0.1703';

;WITH x AS
(
  SELECT id, name, build FROM #x
  UNION ALL 
  SELECT id = NULL, name = NULL, build = @criteria
),
y AS
(
  SELECT id, name, build,
    bn = PARSENAME(build,3)*10000000 + PARSENAME(build,2)*100000 + PARSENAME(build,1)
  FROM x
)
SELECT id, name, build FROM y 
  WHERE bn < (SELECT bn FROM y WHERE id IS NULL);

这假定:

  • 所有构建都来自同一产品,等等 始终包含相同数量的“部件” 不要包含字符
  • 10.0.14393 > 10.0.1703
© www.soinside.com 2019 - 2024. All rights reserved.