2016-10-04 52 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

這似乎這樣的伎倆!而且很好的解釋,沒有把它當做正文:-) –