How to ORDER BY typical software release versions like X.Y.Z?
To produce your desired output, you can simply:
SELECT id, version
FROM versions
ORDER BY string_to_array(version, '.')::int[];
One can cast a whole text
array to an integer
array (to sort 9
before 10
).
One can ORDER BY
array types. This is the same as ordering by each of the elements. And shorter arrays come before longer ones with identical leading part.
db<>fiddle here
Old SQL Fiddle.
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;
SQLFiddle: http://sqlfiddle.com/#!15/c9acb/1
If you expect more elements in the version string, just use more array indexes. If the index does not exist, the result will be null (e.g. v[10]
will return null
)
create extension semver;
select id, version from SoftwareReleases order by version::semver;
http://www.pgxn.org/dist/semver/doc/semver.html