2012-09-06 73 views
3

我有一個varchar列,我想排序數字,這使用這個技巧時很好:https://stackoverflow.com/a/5418033/1005334(簡而言之:...ORDER BY Result * 1)。MySQL排序varchar列數字,數字第一

但是,有關表格包含結果。因此,像這樣出現:

Result 
------ 
DNS 
DNF 
1 
2 
3 

的數字是正確的排序,但DNF排序是這樣,當談到數字的上方。我想要的是數字排序,但非字母數字排序的非數字低於的數字。像這樣:

Result 
------ 
1 
2 
3 
DNF 
DNS 

以什麼方式我可以修改查詢(最好只有ORDER BY條款)來得到這樣的結果?

回答

3

使用LPAD

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_lpad

LPAD(yourField, 20, '0'); 

這將管理的 「VARCHAR數字字段」(10將是2後),正確的順序,並把字符串結尾。

SqlFiddle

的第二個參數(20)是相當武斷的。它應該等於(或者大於)字段中最長字符串的長度。

+0

清潔功能,這似乎是工作,但我不明白怎麼做 –

+0

看到這個[* SQLFiddle *](http://sqlfiddle.com/#!2/78de4/1) –

+0

@JohnWoo我在參數順序上犯了一個錯誤。糾正。 http://sqlfiddle.com/#!2/78de4/3 –

1

您可以通過使用MySQL's REGEXP來做到這一點。試試這個,

SELECT * 
FROM tablea 
ORDER BY IF(`Result` REGEXP '^-?[0-9]+$', 0, 1) ASC, 
      `Result` ASC 

SQLFiddle Demo

+0

http://sqlfiddle.com/#!2/32903/1 Robin Castlin的答案在這一點上更好。 –

1

試試這個:

請與本改變您的ORDER BY子句:

ORDER BY 
    CASE WHEN Result REGEXP '^[0-9]+$' THEN Result*1 else 999999 END, 
     Result 

這將責令數值第一那麼剩下的

+0

這給了我'正規'字母排序:'1,10,11 ...等DNF,DNS' ... – kasimir

+0

@ kasimir:我ipdated我的答案Plz檢查現在 –

+0

它的工作。但我認爲'LPAD'解決方案更加優雅(更短)。 – kasimir

0
ORDER BY CAST(`Result` AS SIGNED) DESC 

這應該工作。

+0

我曾試過這個。這給了我倒序:'3,2,1,DNF,DNS',我在'1,2,3,DNF,DNS'之後。 – kasimir

2
SELECT *, (Result REGEXP '^[0-9]+$') AS is_numeric 
FROM table_name 
ORDER BY is_numeric DESC, 
    CASE WHEN is_numeric THEN (Result + 0) ELSE Result END ASC