【问题标题】:SQL Server Filter by VersionSQL Server 按版本筛选
【发布时间】:2015-04-15 13:52:33
【问题描述】:

好吧,假设我想过滤一个存储了 X.X.X 格式的版本号的表。

如果我只想过滤单个版本号,这很容易。

where version = '3.12.92'

举个例子。

但是,如果我正在寻找某个 RANGE 版本,例如从“2.21.23”到“3.12.92”,该怎么办?按版本范围过滤的最简单但可靠的解决方案是什么?

编辑:更改表格的格式为时已晚。该表已有数年历史,有数百万个条目。

【问题讨论】:

  • 真正的解决方案是修复您的表格设计,然后您的搜索将是微不足道的。永远不要在单个列中组合多个值,您将永远无法将它们分开。如果您将版本的每个部分放在不同的列中,您可以轻松地做到这一点。
  • 太晚了,我正在搜索的表有数百万个条目。
  • 所有版本字符串的格式是否总是x.y.z(三部分,两位小数)?
  • 最好的短期选择是获取一个临时表/派生表/表变量/cte,其中包含您范围内的每个版本并进行连接。从长远来看,我会寻找一个预置索引计算列,您可以在其中将它们编码为 int 或 big int,您可以在其中使用前导零并在其上放置索引。比如:“3.12.92”变成:“300120092”和1.2.3变成“100020003”

标签: sql-server


【解决方案1】:

解决方案是将版本位分成单独的列以便快速修复,您可以使用以下查询

DECLARE @version VARCHAR(100) = '3.12.92';

SELECT  REVERSE(PARSENAME(REVERSE(@version) , 1)) AS FirstBit
       ,REVERSE(PARSENAME(REVERSE(@version) , 2)) AS MiddleBit
       ,REVERSE(PARSENAME(REVERSE(@version) , 3)) AS LastBit 

结果:

FirstBit    MiddleBit    LastBit
   3           12          92

where first bit = 3 的 Where 子句看起来像....

WHERE REVERSE(PARSENAME(REVERSE(@version) , 1))  = '3'

【讨论】:

    【解决方案2】:

    如果总是最多三个用点分隔的两位数字,您可以编写一个函数将x.y.z 转换为x*10000 + y*100 + z 形式的整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2020-07-22
      • 2010-12-20
      • 1970-01-01
      • 2018-09-26
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多