2016-10-04 69 views
1

我想按其值从最低到最高排序一列。但是,该列有一个前缀集,因此其内容可能如下所示:SR1001000。我认为,如果我想订购这个,我需要删除前缀。所以现在我的查询看起来是这样的:MySQL - 订单子串数位从最低到最高

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

正如你可以看到,第一行是明显高于第二高的数字。为什么是这样?

回答

2

排序关闭的原因,目前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 
+1

这似乎这样的伎俩!而且很好的解释,没有把它当做正文:-) –