2012-07-09 235 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