【问题标题】:SQL Server: How do I sort and compare lots of versions?SQL Server:如何对多个版本进行排序和比较?
【发布时间】:2019-02-25 10:37:42
【问题描述】:

在我对表格的请求中,我必须找到版本小于或等于 10.0.1703 (

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?

【问题讨论】:

  • 您能否发布一些示例数据和预期结果?此外,其中一个链接是针对 MySQL 的,它是与 SQL Server 完全不同的 RDBMS;您实际使用的是哪个?但是,理想情况下,如果您将版本号存储在数据中,最好将它们存储在不同的部分而不是 1 中。即有 4 列,例如 MajorVersionNumberMinorVersionNumberBuildNumberRevisionNumber
  • (我将其添加到问题描述中)我使用 SQL Server。结果中所需行的示例是在此处输入图像描述 id name build(version) 1 A 10.0.1703 2 B 6.3.9600 我必须找到所有旧版本或等于 10.0.1703 。 6.3.9600 小于 10.0.1703
  • 好的,现在我们只需要确认您正在使用的 RDBMS。我不想给出一个 T-SQL 答案,然后找出你使用 MySQL。如果你运行 PRINT @@VERSION; 会返回什么?
  • Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64) Nov 30 2018 12:57:58 版权所有 (C) 2017 Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows Server 2016 标准版 10.0 (内部版本 14393:)

标签: sql sql-server versioning


【解决方案1】:

一种方法是转换为hierarchyid

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

DEMO

【讨论】:

  • 谢谢,这个查询有效,但遗漏了很多与 10.0.14393、5.2.3790、10.0.15063 等构建(版本)有关的行。
  • @smpr - 它返回5.2.3790(演示rextester.com/CAIKQ32951),并且错过了其他两个是正确的。它们高于10.0.17031439315063 都大于 1703,因此它们具有相同的主要和次要版本以及更高的补丁版本
【解决方案2】:

我同意@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 &gt; 10.0.1703

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2015-02-16
    • 2011-03-29
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多