0

目前我正在尝试从我的数据库中取出一列并尝试对其进行排序,以便列中的数字按顺序排列,然后是带有数字的字母。当我使用以下语句时

SELECT * 
FROM term_size_ref 
WHERE 1=1 
ORDER BY LPAD(term_size, 10000, '0');

我得到以下结果,在带有数字的字母进入后,排序再次变得混合。

有没有办法在显示字母之前按顺序排列所有数字?(例如 0.025 -> 1.0 -> 400 -> A3)

查询结果:


0.025
0.045
0.25
0.90
0.1
0.9
4
12
13
22
040
45
50
070
90
A1
B1
M8
RH
W1
W2
W3
1.0
1.1
1.6
1.8
100
110
187
2.3
2.4
250
3.0
4.8
400
630
8.0
800
9.5

4

1 回答 1

0

嗯,当非数字部分始终是前缀而另一部分是数字的有效表示形式的字符串(带有可选符号的十进制)或空字符串时-您的示例数据表明--,您可以先排序按字典顺序按前缀,然后按数字的值。为此,您可以使用regexp_replace()分别删除数字或前缀。

SELECT *
       FROM term_size_ref
       ORDER BY regexp_replace(term_size,
                               '[\d.\-+]+$',
                               '') ASC,
                nullif(regexp_replace(term_size,
                                     '^[^\d.\-+]+',
                                     ''),
                       '')::decimal ASC
                                    NULLS FIRST;

db<>小提琴

如果可能的话,您还可以考虑拆分数据并将前缀放在自己的列中。

于 2021-12-21T01:59:07.230 回答