MySQL - 从最低到最高排序子串数字

标签 mysql substring sql-order-by

我想按值从低到高对列进行排序。但是,该列有一个前缀集,因此它的内容看起来像这样 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 将您的计算列视为文本,而不是数字数据。这具有以下不良副作用:

10002000
1001000
   ^

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

1000200
1001000

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

尝试以下查询:

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

关于MySQL - 从最低到最高排序子串数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39846891/

相关文章:

python - 如何从以空格结尾的字符串中排除子字符串?

c# - 将自己的 IComparer<T> 与 Linq OrderBy 结合使用

MySQL行号

oracle order by 运行速度非常慢

mysql - Orbeon 表格 2018.1.1 CE 和 MySQL : 'Error performing search' received on summary page of any created form

mysql - 如何在mysql查询中应用GROUP_CONCAT

java - 在一行中仅打印字符串的前 5 个字符

r - 从 R 中的字符串中提取最后 n 个字符

MySQL 选择不忽略重复项?

php - MySQL:A100000 和 A200000 之间