2009-05-04 58 views
51

我有一個執行select語句的存儲過程。我希望我的結果按日期字段排序,並首先顯示所有記錄爲NULL的日期,然後顯示最近的日期。ORDER BY DATE顯示NULLS第一次然後最近的日期

聲明看起來是這樣的:

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY [Submission Date] ASC 

現在這將顯示所有記錄與NULL提交日期第一,但是當我到達那個在他們的日期值的行,他們是不是在最近的日期風景。

如果我用DESC替換ASC,然後按照我想要的順序得到日期,但NULL值位於結果集的底部。

是否有任何方法來構建我的查詢,以便我可以在頂部顯示空值,然後當有日期值時,按順序將它們從最近到最下面排序?

回答

85

@Chris,你差不多有它了。

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

[編輯:#Eppz問我要調整上面顯示目前代碼]

我個人比較喜歡這個有很多比創建「幻數」更好。魔術數字幾乎總是一個等待發生的問題。

3

嘗試

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99與拋出一個錯誤,因爲它不能被解析到一個日期。 – Eppz 2009-05-04 20:19:27

+0

我會用這個解決方案而不是案例。 – Ionic 2015-06-28 20:06:57

+0

可以在LINQ – yoohoo 2016-09-02 18:33:29

21

你可以做這樣的事情放在空的底部:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC 
+0

+1中輕鬆使用,這是我在Access SQL中唯一的解決方案。 – 2013-06-10 14:13:39

+1

這也適用於SQLite。 – IAmKale 2013-08-30 20:22:12

+0

是否有任何理由你有方括號? – AndrewBramwell 2016-05-11 12:46:34

0

試試這個

選擇A,B,C,[投稿日期] FROM someView ORDER BY isnull([Submissi ('1770/01/01'作爲日期時間))ASC

14

標準SQL(ISO/IEC 9075-2:2003或更高版本 - 2008年)爲:

ORDER BY SomeColumn NULLS FIRST 

大多數DBMS實際上並不支持這個呢,據我所知。

1
OrderBy="ColumnName = NULL desc, ColumnName desc" 
0

我知道這是舊的,但是當我發現我注意到接受的解決方案,https://stackoverflow.com/a/821856/7177892,可以通過將CASE語句是不是今天(GETDATE())或實際日期的結果進行簡化。

原文:

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

簡體:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
       THEN GETDATE() 
       ELSE [Submission Date] 
      END) DESC 
相關問題