Ada*_*dam 9 mysql sql versioning
我的一个SQL表中有一个字段存储版本号,如'3.4.23'
或'1.224.43'
.
有没有办法为这个字段使用大于条件?
SELECT * FROM versions WHERE version_number > '2.1.27'
感谢@symcbean和@ gordon-linoff的提示,我的最终查询如下所示:
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'));
Run Code Online (Sandbox Code Playgroud)
这允许每个组件长达10位数.
它改变了这个:
X.XX.XXX > 2.1.27
Run Code Online (Sandbox Code Playgroud)
对此:
'000000000X00000000XX0000000XXX' > '000000000200000000010000000027'
Run Code Online (Sandbox Code Playgroud)
虽然可以编写一个比较版本号的函数,但这是解决问题的正确方法吗?比较 f(x) 和 f(y) 不能被索引。如果您知道版本号的任何部分永远不会超过 4 位数字,那么您可以创建一个额外的字段来保存用 0 填充的值(或在 Mariadb 上,使用虚拟列),该字段可以被索引,例如2.1.27
将成为'000200010027`。
如果您停止尝试使用这样的编号模式而只使用整数或日期时间,那将会简单得多。如果您必须坚持使用此编号,请考虑将数据拆分为 3 列。
为了快速破解,如果您知道版本号将始终具有 3 个组件并且每个组件将始终小于 256,那么您可以......
SELECT *
FROM versions
WHERE INET_ATON(CONCAT(version_number, '.0')) > INET_ATON('2.1.27.0');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3480 次 |
最近记录: |