按数字字段对 varchar 进行排序

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)

数据库小提琴在这里

我的问题是:

  1. 使用 ORDER 子条款实现此目的最简单的方法是什么?
  2. 如何使用这种自定义排序添加高效索引而无需修改表?

我想至少保留第一个答案尽可能与数据库无关(这就是为什么我没有包含数据库特定标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么我们假设 PostgreSQL 12。