MySQL排序varchar列数字,数字优先

时间:2012-09-06 08:05:14

标签: mysql

我有一个varchar列,我想对数字进行排序,这在使用这个技巧时效果很好:https://stackoverflow.com/a/5418033/1005334(简称:...ORDER BY Result * 1)。

但是,有关表格包含结果。所以发生这样的事情:

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

这些数字是正确排序的,但DNF在这样排序时高于数字。我想要的是使用数字排序,但非数字按字母顺序排列 数字。像这样:

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

我可以用什么方式修改查询(最好只有ORDER BY子句)才能得到这个结果?

5 个答案:

答案 0 :(得分: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)非常随意。它应该等于(或大于)你字段中最长字符串的长度。

答案 1 :(得分: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

答案 2 :(得分:1)

您可以使用 MySQL's REGEXP 来实现。试试这个,

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

SQLFiddle Demo

答案 3 :(得分:1)

试试这个:

请用以下内容更改您的ORDER BY条款:

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

这将首先排序数值,然后是其余的

答案 4 :(得分:0)

ORDER BY CAST(`Result` AS SIGNED) DESC

这应该有效。