2010-02-07 45 views
6

我试图从我的MYSQL数据库表中取出一个有序列表基于整数值'地点'。重新排序整数,除了值为0与SQL

SELECT * FROM mytable 
ORDER BY place; 

这工作正常,除了值的地方= 0所有行应出现在表的末尾。

所以,如果我的表是:

name place 
---- ----- 
John 1 
Do 2 
Eric 0 
Pete 2 

它应该成为:

name place 
---- ----- 
John 1 
Do 2 
Pete 2 
Eric 0 

回答

4
SELECT * 
FROM myTable 
ORDER BY place>0 DESC, place 

是没有CASE

+0

我喜欢这个解决方案,因为它很小,看起来没问题。除非效率较低,否则我会保持这一点。 – Roalt 2010-02-07 21:18:39

+0

或只是'ORDER BY place = 0,place' – ysth 2010-02-07 23:32:30

6
order by case when place = 0 then 1 else 0 end asc, place asc 

这样,你得到所有非零下令第一。

+0

解决以前从未见过的表壳结构(但后来,我在前期得到了我的SQL类九十年代)。由于简单,我更喜欢@True Soft。 – Roalt 2010-02-07 21:20:20

2
SELECT * 
FROM myTable 
ORDER BY CASE place WHEN 0 THEN 9999 ELSE place END 

此方法意味着我们知道9999(或其他某个值)大于位置列中的所有可能值。

我们也可以在两个值进行排序:

ORDER BY CASE place WHEN 0 THEN 0 ELSE -1 END, place 
+0

谢谢,9999个技巧是我自己想到的,只是不知道你可以改变评估的订单排序标准。如果重复的订单清单会有很高的性能损失,这将是我的第一个选择。 – Roalt 2010-02-07 21:24:31