考虑我有一个表名“test”的情况
-------
content (varchar(30))
-------
1
abc
2
bcd
-------
如果我按照
使用订单 Select * from test order by content asc
我可以得到像
这样的结果
--------
content
--------
1
2
abc
bcd
---------
但有什么办法可以使用查询
获得以下结果
--------
content
--------
abc
bcd
1
2
---------
答案 0 :(得分:2)
要通过整理,你可以通过测试第一个字符来做...看起来你想要任何以数字开头的东西都是在任何alhpa导向之后...类似于Ted的ISNUMERIC()表示,但是我的快速检查在MySQL中没有显示这样的功能..所以另一种选择......因为ASCII列表中的数字小于“A”(字符65)
Select *
from test
order by
case when left( content, 1 ) < "A" then 2 else 1 end,
content
虽然我看过不同的CONVERT()调用,但我没有MySQL可用来确认。但是,除了上述情况/何时,您可以添加SECOND case / when并在“content”值上调用一些UDF()或其他转换函数。如果字符串以alpha开头,它应该返回一个零值,所以第一个case / when将它们保持在列表的顶部,然后因为所有都是不可转换为numeric的值将为零...没有影响在排序上,最后是内容本身,它将保持alpha顺序。
但是,如果您的第二个case / when / convert函数调用DOES返回一个数值,那么它将在数字分组段中正确排序...然后将取代内容的那个...但是,如果内容就像是
100 smith rd and
100 main st
它们将按相同的“100”类别数值排序,但按内容按字母顺序排序为
100 main st
100 smith rd
100
答案 1 :(得分:2)
这样做:
SELECT *
FROM test
ORDER BY CAST(field AS UNSIGNED), field ASC
答案 2 :(得分:1)
select * from sometable order by content between '0' and '9', content
答案 3 :(得分:0)
结果的顺序由使用的排序规则定义,因此如果您能找到正确的排序规则,那么是。
http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html
//修改
这很棘手。我做了一些研究,似乎目前没有可用的校对可以做到这一点。但是,也有可能为MySQL添加新的排序规则。 Here's how.
答案 4 :(得分:0)
在MySql上不确定,但在SQL Server上你可以这样做......
SELECT * FROM test
ORDER BY IsNumeric(content), content