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 次 |
| 最近记录: |