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

时间:2016-10-04 07:47:53

标签: mysql substring sql-order-by

我想按其值排列一列,从最低到最高。但是,该列具有前缀集,因此其内容可能看起来像SR1001000。我认为ifi想订购这个,我需要删除前缀。所以现在我的查询看起来像这样:

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
...

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

1 个答案:

答案 0 :(得分:2)

排序的原因是当前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