2009-08-28 50 views
6

訂購這是我的代碼現在:訂購空,再由其他變量

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY id, number 

,但我希望它看起來像:

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY while(number IS NULL), id 

我想要做的是有所有numberNULL對結果的頂部,但只要numberNULL,排序id

這可能嗎?

我使用mysql。

回答

19

怎麼樣這樣的:

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY (case when number is null then 0 else 1 end), id 

如果number爲NULL,通過標準的第一順序將是0;否則1
這意味着每一行數字NULL都會在其他數字之前出現

並且請注意,ID也將被排序。

你會得到這樣的事情:

  • 號空; id = 1
  • number null; id = 2
  • number null; id = 5
  • number null; id = 8
  • number not null; id = 3
  • number not null; id = 4
  • number not null; id = 7
  • number not null; id = 10
  • number not null; id = 12
+0

這就是我通常這樣做的方式。 – RiddlerDev 2009-08-28 15:58:08

+0

非常好!快速的答案,我第一次嘗試。謝謝! – Johan 2009-08-28 16:00:58

+0

不客氣:-)玩得開心! – 2009-08-28 16:02:52

-1

聯盟也可以使用。

SELECT id, number 
FROM Media 
WHERE user = 10 AND number IS NULL 
ORDER BY id 

UNION 

SELECT id, number 
FROM Media 
WHERE user = 10 AND number IS NOT NULL 
ORDER BY id, number; 
+0

除了稍微錯誤的語法(缺少括號)之外,這是沒有意義的,因爲'UNION'不能保證保存單個選擇的順序。此外,這會產生一個不必要的昂貴的執行計劃(在'number'列上有兩個'NULL'檢查)。 – 2011-05-14 08:59:08

1

如果參數爲空,則ISNULL()函數返回1,否則返回0。

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY ISNULL(number) DESC, id 

請注意,根據需要訂購多少個值,性能會很差:不會根據ORDER BY列使用索引。