3

我有一个 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子句)来获得这个结果?

4

5 回答 5

4

使用 LPAD

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

LPAD(yourField, 20, '0');

这将管理“varchar 数字字段”的正确顺序(10 将在 2 之后)并将字符串放在末尾。

SqlFiddle

第二个论点(20)是相当随意的。它应该等于(或大于)您的字段中最长字符串的长度。

于 2012-09-06T08:08:42.083 回答
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
于 2012-09-06T08:12:37.770 回答
1

您可以使用MySQL 的 REGEXP来做到这一点。试试这个,

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

SQLFiddle 演示

于 2012-09-06T08:08:43.970 回答
1

尝试这个:

请更改您的 ORDER BY 条款:

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

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

于 2012-09-06T08:09:11.490 回答
0
ORDER BY CAST(`Result` AS SIGNED) DESC

这应该有效。

于 2012-09-06T08:10:03.597 回答