gpt4 book ai didi

sql - 在postgres中像excel一样排序

转载 作者:行者123 更新时间:2023-11-29 14:15:05 24 4
gpt4 key购买 nike

我在表中有一列的值是,

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

关于sql - 在postgres中像excel一样排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51943140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com