我在表中有一列,其值是
a100,a7,a20,16,17,bbb,ccc,15kk,24dd
我想对该列进行排序,并且预期结果(与excel相同)是
16,17,15kk,24dd,bbb,ccc,a7,a20,a100
即:
先倒空,然后是数字,然后是字母数字,然后是字母,然后是字母数字。 我尝试了Google的多种解决方案,但均失败了。大多数解决方案都是将数字和字母数字混合在一起,例如15kk,16、17。
答案 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
对组内的字母数字值进行排序