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
。
这与按每个元素排序相同。
较短的数组排在较长的数组之前,具有等效的前导部分。
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
归档时间: |
|
查看次数: |
11768 次 |
最近记录: |