这应该这样做:
order by regexp_replace(the_column, '[^0-9\.]', '', 'g')::numeric DESC
它从值中删除所有非数字字符(只留下数字和.
),然后将其转换为数字。然后将该数字用于降序排序
唯一的问题是 5.0 会排在 5.1 之后。
如果您需要考虑没有任何数字的值,如下所示:
order by
case
when regexp_replace(the_column, '[^0-9\.]', '', 'g') <>
then regexp_replace(the_column, '[^0-9\.]', '', 'g')::numeric
end DESC NULLS LAST,
the_column DESC -- to sort the "NULL" values alphabetically
如果您不想重复正则表达式,您可以执行以下操作:
with clean_data as (
select the_column,
regexp_replace(the_column, '[^0-9\.]', '', 'g') as clean_column,
....
from ...
)
select *
from clean_data
order by case
when clean_column <> '' then clean_column::numeric
end desc nulls last,
the_column desc;