2012-07-09 120 views
2

请看下面的例子:排序顺序

+---------+------------+ 
| value | name  | 
+---------+------------+ 
|  42 | abresas | 
|  0 | dionyziz | 
|  6 | dionyziz2 | 
|  0 | izual  | 
|  8 | kokos  | 
|  37 | kostis90gr | 
|  0 | test  | 
|  35 | usertest | 
+---------+------------+ 

我想这个排序中值的升序,但我希望所有值为0的名字在底部显示。所以排序顺序应该是: 6,8,35,37,42,0,0,0

任何想法,如果这可能与SQL或不?

回答

7

当然。使用IF function

ORDER BY IF(value=0,1,0), value 
+1

小提琴:http://sqlfiddle.com/#!2/ 4c64e/1 – biziclop 2012-07-09 15:54:26

+0

@biziclop太快了! +1 – 2012-07-09 15:55:29

+0

添加了IF函数文档的链接,因为我不知道它存在!谢谢。 – 2012-07-09 16:01:52

4

是的,你只需要通过条款调整顺序:

order by (case when value = 0 then 999999 else value end) 

是做它,假设有一个最大的一种方式。另一种更普遍的方法是:

order by (case when value = 0 then 1 else 0 end), value 
+2

也许这只是我,但我真的*讨厌*使用你的第一个建议的幻数。当我有一个价值= 1034120的记录时,我已经忘记了所有关于这个神奇的数字,并开始想知道为什么我的排序关闭。 – 2012-07-09 15:57:31

+0

我同意lc。我的upvote是你的第二个代码片段,我认为这是迄今为止最好的答案。 – 2012-07-10 08:32:26

-1

可以使用UNION关键字为两个不同的查询结果相结合是这样的:

(select * from tableName where value>0 order by value) 
union 
(select * from tableName where value=0) 
+1

'ORDER BY'子句使数据库返回一个游标,强制执行一个命令。理论上,两个结果集合的“UNION”产生另一个结果集合,它没有顺序。实际上,数据库引擎在物理上将结果集实体化为第一个结果集的所有行,后跟第二个结果集的所有行,但不必按此顺序返回行。也可以在第一个结果集之前实现第二个结果集,这仍然是正确的,但会破坏您的排序。请改用显式的'ORDER BY'子句。 – 2012-07-09 16:35:47