如何按 XYZ 等典型软件版本进行订购?

Chr*_*tti 20 postgresql order-by sorting natural-sort

给定一个“SoftwareReleases”表:

| id | version |
|  1 | 0.9     |
|  2 | 1.0     |
|  3 | 0.9.1   |
|  4 | 1.1     |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
Run Code Online (Sandbox Code Playgroud)

我如何产生这个输出?

| id | version |
|  1 | 0.9     |
|  3 | 0.9.1   |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
|  2 | 1.0     |
|  4 | 1.1     |
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 32

要产生您想要的输出:

SELECT id, version
FROM   versions
ORDER  BY string_to_array(version, '.')::int[];
Run Code Online (Sandbox Code Playgroud)

将整个text数组转换为一个integer数组(在9之前排序10)等等ORDER BY
这与按每个元素排序相同。
较短的数组排在较长的数组之前,具有等效的前导部分。

db<>fiddle here
旧的sqlfiddle

  • 如果您正在处理可能包含非数字字符的 Maven 版本或版本,您可以先删除非数字字符:`string_to_array(regexp_replace(version, '[^0-9.]', '', 'g '), '.')::int[]` (3认同)

a_h*_*ame 6

select id,
       name, 
       v[1] as major_version,
       v[2] as minor_version,
       v[3] as patch_level
from (
   select id, 
          name, 
          string_to_array(version, '.') as v
   from versions
) t
order by v[1]::int desc, v[2]::int desc, v[3]::int desc;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle:http ://sqlfiddle.com/#!15/c9acb/1

如果您希望版本字符串中有更多元素,只需使用更多数组索引。如果索引不存在,结果将为空(例如v[10]将返回null


小智 5

创建扩展服务器;

选择 id, version from SoftwareReleases order by version::semver;

http://www.pgxn.org/dist/semver/doc/semver.html