现在没有这个环境了。测试不了。你自己用正则提取出来后。。。再对辅助的一列排序就行了
pgsql 有很强大的正则匹配函数。你自己分别提取出来后。再排序了。。
模式匹配 (postgres.cn)
pgsql提取数字。正则负数有小数的类似这样
select regexp_replace('提取123.11abc提取','[^\d.\d]','','g')
postgresql正则表达使用_二两芝麻的博客-CSDN博客
select
t3.数据
from (
select
t2.*,
case when t2.判断=3 then t2.内容 else 9999 end as 文本,
case when t2.判断=1 then t2.内容 else 9999 end as 正数,
case when t2.判断=2 then t2.内容 else 9999 end as 负数
from (
select
t.数据,
case when length(regexp_replace(t.数据,'[^a-zA-Z]','','g')) >0 then length(t.数据)
when length(regexp_replace(t.数据,'[^(\-|\+)?\d+(\.\d+)?]','','g'))>0 then cast (regexp_replace(t.数据,'[^(\-|\+)?\d+(\.\d+)?]','','g') as integer)
else 999999 end as 内容,
case when length(regexp_replace(t.数据,'[^a-zA-Z]','','g'))>0 then 3/*如果有字母就先赋值一个3.为了排序用*/
when length(regexp_replace(t.数据,'[^(\-|\+)?\d+(\.\d+)?]','','g'))>0 and cast (regexp_replace(t.数据,'[^(\-|\+)?\d+(\.\d+)?]','','g') as integer)>0 then
1 else 2 end as 判断
from (
select '-123' as 数据
union all
select '78' as 数据
union all
select '78abc_16.45_AET' as 数据
union all
select '-950' as 数据
union all
select '66' as 数据
union all
select '78abc' as 数据
) t
) t2
) t3
order by t3.判断,t3.正数 asc, t3.负数 asc,t3.文本
结果: