MySQL查询 - 比较版本号

时间:2016-01-19 12:21:32

标签: mysql sql versioning

我的一个SQL表中有一个字段,用于存储版本号,例如'3.4.23''1.224.43'

有没有办法在此字段中使用大于的条件?

SELECT * FROM versions WHERE version_number > '2.1.27'

4 个答案:

答案 0 :(得分:8)

感谢@symcbean和@ gordon-linoff的提示,我的最终查询如下:

NSError

这允许每个组件最多10位数。

它改变了这个:

SELECT *
FROM versions WHERE CONCAT(
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(version_number, '.', 1), '.', -1), 10, '0'),
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(version_number, '.', 2), '.', -1), 10, '0'),
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(version_number, '.', 3), '.', -1), 10, '0') 
       ) > CONCAT(LPAD(2,10,'0'), LPAD(1,10,'0'), LPAD(27,10,'0'));

到此:

X.XX.XXX > 2.1.27

答案 1 :(得分:2)

虽然可以编写一个可以比较版本号的函数,但这是解决问题的正确方法吗?比较f(x)和f(y)不能被索引。如果您知道版本号的任何部分永远不会超过,例如4位数,那么您可以创建一个额外的字段,其中包含用0' s填充的值(或在Mariadb上使用虚拟列,可以编入索引) ,例如2.1.27将成为' 000200010027`。

如果您停止尝试使用这样的编号模式并且仅使用整数或日期时间,那将会更加简单。如果您必须坚持使用此编号,请考虑将数据拆分为3列。

对于快速入侵,如果您知道版本号将始终包含3个组件且每个组件始终小于256,那么您可以...

SELECT * 
FROM versions 
WHERE INET_ATON(CONCATversion_number, '.0') > INET_ATON('2.1.27.0');

答案 2 :(得分:1)

在多种条件下,这有点痛苦。这是一种蛮力方法:

where substring_index(version_number, '.', 1) + 0 > 2 or
      (substring_index(version_number, '.', 1) = '2' and
       substring_index(version_number, '.', 2) + 0 > 2.1
      ) or
      (substring_index(version_number, '.', 2) = '2.1' and
       substring_index(version_number, '.', -1) + 0 > 27
      )

注意:右侧可以使用相同的substring_index()表达式,但使用常量可以更容易地看到逻辑。

答案 3 :(得分:0)

@Adam如果有像v1或v1.2这样的简短版本号,那么首先需要更好的concat CONCAT(version_number, '.0.0') {{1}}