我正在开发/维护/策划从各种可穿戴研究设备收集的测试结果数据库。每个设备都有三个主要组件,每个组件都有两个版本号(固件和硬件)。我使用django应用程序为数据库提供Web界面。版本号表示为直接整数或三元组(主要,次要,构建)。整数很容易处理,我显然可以将三元组存储为字符串,但作为字符串,它们不能正确排序或正确比较,例如,如果我只想要固件版本低于14的设备产生的测试结果某个.XY
我不能使用浮动因为第二个小数点'分隔器。我想可能通过将它存储为日期来进行黑客攻击,但这会将次要数量限制为小于12并将数字设置为小于29,除此之外我知道这是一个可怕的解决方案。我可能不应该承认这一点。
没有使用一些PL / SQL扩展数据库以提供正确处理字符串的比较函数,有一种简单的方法吗?如果没有,我甚至可以使用我的自定义SQL函数与django?
答案 0 :(得分:6)
将它们存储为零填充字符串:
>>> def sortable_version(version):
... return '.'.join(bit.zfill(5) for bit in version.split('.'))
...
>>> sortable_version('1.1')
'00001.00001'
>>> sortable_version('2')
'00002'
>>> sortable_version('2.1.10')
'00002.00001.00010'
>>> sortable_version('10.1')
'00010.00001'
>>> sortable_version('2') > sortable_version('1.3.4')
True
>>> sortable_version('10') > sortable_version('2')
True
>>> sortable_version('2.3.4') > sortable_version('2')
True
您可以随时使用此零填充格式显示常规版本:
>>> def normalize_version(padded_version):
... return '.'.join(bit.lstrip('0') for bit in padded_version.split('.'))
...
>>> normalize_version('00010')
'10'
>>> normalize_version('00002.00001.00010')
'2.1.10'
答案 1 :(得分:1)
您正在寻找的是“自然排序”。
实现此目的的另一种方法是使用数据库排序。以下是Postgres的一个例子:
Execute