在postgres中像excel一样排序

时间:2018-08-21 06:52:35

标签: sql postgresql sorting

我在表中有一列,其值是

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

我想对该列进行排序,并且预期结果(与excel相同)是

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

即:

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

1 个答案:

答案 0 :(得分:3)

类似的东西:

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