>我在表中有一列,其值是,
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