1

我在远程服务器上有一个表,用于存储我们客户端软件的版本号。我使用 SOAP 来处理请求。客户端软件发送一个版本号,我需要使用 SQL 查找下一个版本号。

这是我使用的 SQL。我的大脑一天有点糟糕,我知道这是不正确的,但我似乎无法弄清楚我需要做什么。

创建表代码:

CREATE TABLE IF NOT EXISTS `sqlUpdateVersions` (
  `primary_key` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `comment` text NOT NULL,
  `majorVS` tinyint(4) NOT NULL,
  `minorVS` tinyint(4) NOT NULL,
  `revisionVS` tinyint(4) NOT NULL,
  `buildVS` tinyint(4) NOT NULL,
  `filePK` int(11) NOT NULL,
  `customDBJarPK` int(11) DEFAULT NULL,
  PRIMARY KEY (`primary_key`),
  KEY `filePK` (`filePK`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

这是查找版本号的 SQL 查询。我在这个版本中转储了 1.1.0.0

select b.majorVS, b.minorVS,b.revisionVS, b.buildVS
 from sqlUpdateVersions b  where
 b.majorVS>=1 AND b.minorVS >=1 AND b.revisionVS>=0 AND b.buildVS>=10 
 ORDER BY b.majorVS,b.minorVS,b.revisionVS, b.buildVS

现在很明显我可以告诉这个 SQL 是有问题的。但是我将如何构造一个返回下一个值的结构,比如 1.2.0.0 或 1.1.1.0

谢谢。

4

1 回答 1

2

这是一种蛮力方法:

select suv.*
from sqlUpdateVersions suv
where suv.majorVS > 1 or
      (suv.MajorVs = 1 and suv.minorVS > 1) or
      (suv.MajorVS = 1 and suv.minorVS = 1 and suv.revisionVS > 0) or
      (suv.MajorVS = 1 and suv.minorVS = 1 and suv.revisionVS = 0 and suv.buildVS > 10)
order by suv.MajorVS, suv.MinorVS, suv.revisionVS, suv.buildVS

您还可以将版本转换为 bigint 并直接进行比较:

select suv.*
from (select suv.*,
             buildVS + (cast(1000 as bigint)*revisionVS +
                        (cast(1000 as bigint)*minorVS +
                         (cast(1000 as bigint)*majorVS
                         )
                        )
                       ) as bigVersion 
      from sqlUpdateVersions suv
     ) suv
 where bigversion > 1001000010
于 2013-02-15T16:28:30.543 回答