I have a sorting issue in postgres in a column with values such as version. Version is character varying, with values such as the following (un-ordered).
1.2
One way: (works if version may have maximum 3 parts)
with t(col) as(
select '1.9' union all
select '2' union all
select '1.2' union all
select '1.10.1'
)
select * from t
order by
case when split_part(col, '.', 1) = '' then 0 else split_part(col, '.', 1)::int end desc,
case when split_part(col, '.', 2) = '' then 0 else split_part(col, '.', 2)::int end desc,
case when split_part(col, '.', 3) = '' then 0 else split_part(col, '.', 3)::int end desc