【问题标题】:LPAD Ordering with decimals and varchar带小数和 varchar 的 LPAD 排序
【发布时间】:2022-01-22 09:11:45
【问题描述】:

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

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

【问题讨论】:

    标签: sql postgresql sql-order-by lpad


    【解决方案1】:

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

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

    【讨论】:

    • 问题是查询仍然按第一个值对数字进行分组。所以 1, 2, 3, 4, 10, 11, 21 ,22 将被打印为 1, 10, 11, 2, 21, 22, 3, 4
    • @Heroice18:不,它没有。它按其数值不是按字典顺序对第二部分进行排序。见:dbfiddle.uk/…
    • 如果“::decimal”是查询的一部分,查询似乎会失败。似乎因为遇到文本而不是数字而失败?当我删除它时,查询会返回乱序的数字。例如 1.6、1.8、10、100、1000、1111111111、12、187、2.6、2.8、9、9.5、90、1.0/2.4
    • @Heroice18:当然是这样。我将演员表放在那里是有目的的,即准确地预测数字上下文,以便以数字方式进行排序。
    • 那么我该如何解决“数字类型的无效输入语法:”“”错误?我需要加入 CAST 吗?或者我需要做什么才能使查询正常工作?
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2012-03-28
    • 2014-06-10
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多