我有一个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
子句)才能得到这个结果?
答案 0 :(得分:3)
使用LPAD
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_lpad
LPAD(yourField, 20, '0');
这将管理“varchar数字字段”的正确顺序(10将在2之后)并将字符串放在最后。
第二个参数(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
答案 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
这应该有效。