在邮政中像excel一样排序



>我在表中有一列,其值是,

a100,a7,a20,16,17,bbb,ccc,15kk,24dd

我想对此列进行排序,预期结果(与 excel 相同(是,

16,17,15kk,24dd,bbb,ccc,a7,a20,a100

即:

先空,然后是数字,然后是字母数字,然后是字母,然后是字母数字。 我已经尝试了谷歌的多种解决方案,但都失败了。大多数解决方案是将数字和字母数字混合在一起,例如 15kk、16、17。

像这样:

with data (nr) as (
values ('a100'),('a7'),('a20'),('16'),('2'),('17'),('bbb'),('ccc'),('15kk'),('24dd')
)
select *
from data
order by case 
when nr ~ '^[0-9]+$' then 1
when nr ~ '^[0-9]+[a-z]+$' then 2
when nr ~ '^[^0-9]+$' then 3
when nr ~ '^[a-z]+[0-9]+' then 4
end, 
case 
when nr ~ '^[0-9]+$' then nr::integer
when nr ~ '^[0-9]+[a-z]+$' then regexp_replace(nr, '[^0-9]+', '', 'g')::integer
else 0
end, 
nr;

以上返回:

nr  
----
2   
16  
17  
15kk
24dd
bbb 
ccc 
a100
a20 
a7  

第一种情况根据值的结构创建"组",

第二种情况确保"实"数根据其数值进行排序,以使'16''2'之后进行排序。

最后nr对组内的字母数字值进行排序

在线示例:http://rextester.com/JMG51196

最新更新