2014-01-19 16 views
1

我有tabl有id(number)和name;如何優先排序有價值的行

一些有姓名和身份證 一些只有ID

前)

+--+----+ 
|id|name| 
+--+----+ 
|1 |ddd | 
+--+----+ 
|2 |eee | 
+--+----+ 
|3 | | 
+--+----+ 
|4 |eee | 
+--+----+ 
|5 | | 
+--+----+ 
|6 |kkk | 
+--+----+ 

我想這有名字的行優先,

+ - + ---- + | id | name | + - + ---- + | 1 | ddd | + - + ---- + | 2 | eee | + - + ---- + | 4 | eee | + - + ---- + | 6 | kkk | + - + ---- + | 3 | | + - + ---- + | 5 | | + - + ---- +

我認爲OrderBy可以用於這個,但不能確定。我嘗試過但徒勞。

我怎樣才能通過SQL?

+2

你使用的是什麼RDBMS? – Mureinik

+0

如果你的RDBMS支持它:ORDER BY name NULLS LAST,編號 – igr

回答

1

你應該把兩件事情進行排序:

  1. 是您的值設置爲所有
  2. 值本身

爲了讓1.發生,你可以用NULLIF(Value, '') = '' - 它會返回1對於null或空值和0爲其他人,所以排序DESC將首先給你非空/非空值。額外的標準排序Value將排序值ASC

類似的東西應該讓:

SELECT * 
FROM TEST 
ORDER BY NULLIF(Value, '') = '' DESC, Value 

這裏的工作演示:http://sqlfiddle.com/#!2/73dab/1

+0

感謝NULLIF是我想擁有的。我需要考慮如何在Doctorine中調整它,非常感謝! – whitebear

0

試試這個

SELECT * 
FROM TEST 
ORDER BY (case when value is null or value='' then 'zzzz' else value end) DESC 

Working Fiddle

(或)

​​
+2

你怎麼知道'zzzz'是最後一個可能的值? – MarcinJuraszek

+0

@MarcinJuraszek我給了可能的最後一個varchar。但我不認爲這不是很好的解決方案。所以我又增加了一個方法 –