【问题标题】:MySQL - Order substring digits lowest to highestMySQL - 从最低到最高的顺序子字符串数字
【发布时间】:2016-10-04 07:47:53
【问题描述】:

我想按列的值排序,从最低到最高。但是,该列设置了前缀,因此其内容可能类似于 SR1001000。我想如果我想订购这个,我需要删除前缀。所以现在我的查询看起来像这样:

SELECT a2t_import.*,SUBSTRING(a2t_import.a2t_vare_nr, 3) as partial_vare_nr 
FROM a2t_import 
ORDER BY partial_vare_nr ASC`

但是我还需要只获取列具有特定前缀的行,我可以通过添加这样的正则表达式来获得该前缀

SELECT a2t_import.*,SUBSTRING(a2t_import.a2t_vare_nr, 3) as partial_vare_nr 
FROM a2t_import 
WHERE a2t_vare_nr REGEXP '^(SR)+[0-9]+' 
ORDER BY partial_vare_nr ASC

这给了我正确的输出,上面的例子看起来像这样1001000,但排序不是我所期望的。

我得到以下输出

10002000
1001000
...

如您所见,第一行的数字明显高于第二行。这是为什么呢?

【问题讨论】:

    标签: mysql substring sql-order-by


    【解决方案1】:

    排序关闭的原因是当前 MySQL 将计算列视为文本,而不是数字数据。这具有以下不良副作用:

    10002000
    1001000
       ^
    

    10002000 首先出现,因为它在字典中会出现在1001000 之前。解决此问题的一个技巧是在排序时也使用字符串的长度。考虑以下比较:

    1000200
    1001000
    

    现在10002001001000 之前,字典排序与数字排序一致。

    尝试以下查询:

    SELECT a2t_import.*,
           SUBSTRING(a2t_import.a2t_vare_nr, 3) AS partial_vare_nr
    FROM a2t_import
    WHERE a2t_vare_nr REGEXP '^(SR)+[0-9]+'
    ORDER BY CHAR_LENGTH(partial_vare_nr),     -- shortest strings first
             partial_vare_nr                   -- lexigraphical sort among strings
                                               -- of same length - agrees with numeric sort
    

    【讨论】:

    • 这似乎可以解决问题!很好的解释,并没有把它当作文本来强调:-)
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 2016-03-19
    • 2013-09-28
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多