MySql排序问题

时间:2011-05-04 11:41:34

标签: mysql

考虑我有一个表名“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
---------

5 个答案:

答案 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