我在远程服务器上有一个表,用于存储客户端软件的版本号。我使用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
感谢。
答案 0 :(得分: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