Cla*_*ani 1 postgresql order-by natural-sort postgresql-12
我确信以前有人问过这个问题,但由于这个问题可以用多种不同的方式表达,因此很难找到正确的答案。
我有一个订单表,其中订单号有一个varchar字段,其格式为 4 位年份、破折号 (-) 和渐进数值。例如,它可能包含以下值:
SELECT number FROM orders ORDER BY number LIMIT 10;
number
----------
1999-13
2019-11
2020-1
2020-10
2020-100
2020-12
2020-2
2020-21
2020-3
2021-1
Run Code Online (Sandbox Code Playgroud)
我需要按年份对该字段进行排序,然后按渐进数字进行排序,预期结果如下:
number
----------
1999-13
2019-11
2020-1
2020-2
2020-3
2020-10
2020-12
2020-21
2020-100
2021-1
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我想至少保留第一个答案尽可能与数据库无关(这就是为什么我没有包含数据库特定标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么我们假设 PostgreSQL 12。
小智 5
我会将该值转换为整数数组,然后对该数组进行排序:
SELECT number
FROM orders
ORDER BY string_to_array(number, '-')::int[]
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)