2012-06-08 103 views
2

我在排序表。小提琴可以找到here在排序中更改NULL的位置

CREATE TABLE test 
(
field date NULL 
); 

INSERT INTO test VALUES 
('2000-01-05'), 
('2004-01-05'), 
(NULL), 
('2008-01-05'); 

SELECT * FROM test ORDER BY field DESC; 

結果我得到:

2008-01-05 
2004-01-05 
2000-01-05 
(null) 

不過,我需要的結果是這樣的:

(null) 
2008-01-05 
2004-01-05 
2000-01-05 

所以NULL值被視爲,如果它比任何其他更高值。是否有可能這樣做?

+0

[ORDER BY DATE顯示NULLS第一次然後最近的日期]的可能的重複(http://stackoverflow.com/questions/821798/order-by-date-showing-nulls-first-then-most-recent-dates ) – GarethD

回答

4

最簡單的就是先添加一個額外的排序條件:

ORDER BY CASE WHEN field is null then 0 else 1 END,field DESC 

或者,你可以嘗試將其設置爲最大其數據類型:

ORDER BY COALESCE(field,'99991231') DESC 

COALESCE/ISNULL做工精細,只要你做的不是H使用相同最大值的「真實」數據。如果你這樣做,並且你需要區分它們,使用第一種形式。

+0

是的,數據是一個正常的範圍內,這是當前的幾天,幾年,(不超過+ - 10年):)感謝您的答案:) –

+0

第一個選項是我的自然傾向。我目前無法訪問數據庫來測試我的假設,但我期望這一點;如果結果集已經是自然排序的,則由於排序字段被「ISNULL()」模糊化,後者將被計劃爲更昂貴的重新排序例程,因此優化器不能「知道」數據自然順序與期望的最終順序之間的關係。 *(這是否有意義?)* – MatBailie

4

使用標誌「的時間結束」來取代空值:

SELECT * FROM test 
ORDER BY ISNULL(field, '9999-01-01') DESC; 
+0

嗯,你想要結束的時間,而不是開始的時間,當訂購'desc'並且首先要'null'時 –

+0

已經在編輯中,但是你打敗了我。 –

+0

啊哈!開始了!又一天,當我學到一些有價值的東西。謝謝:) –

1

對於調用每行函數的查詢要小心,它們很少能很好地擴展。

對於較小的數據集,這可能不成問題,但如果它們變大,則會出現問題。這應該通過定期對查詢進行測試來進行監控。如果您的數據永遠不會發生變化(非常罕見),數據庫優化只能是一次即忘即用的操作。

有時,最好引入一個人工的主要排序列,如用:

select 1 as art_id, mydate, col1, col2 from mytable where mydate is null 
union all 
select 2 as art_id, mydate, col1, col2 from mytable where mydate is not null 
order by art_id, mydate desc 

那麼只有在你的程序中使用result_set["everything except art_id"]

通過這樣做,您不會引入(可能)慢的每行函數,而是依靠mydate列上的快速索引查找。高級執行引擎可以同時運行這兩個查詢,並在完成後將它們結合起來。

+0

感謝您的意見:) –