2009-05-04 6 views
51

私はselect文を実行するストアドプロシージャを持っています。結果を日付フィールドで並べ替え、すべてのレコードをNULL日付で表示してから最新の日付で表示したい。ORDER BY DATEはNULLSから最初の日付を表示します

文は次のようになります。

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

今NULL提出は、最初の日程で、これはすべてのレコードを表示しますが、私は彼らに日付値を持つ行を取得するとき、彼らは最も最近の日付ではありません景色。

ASCをDESCに置き換えた場合、私は必要な順番で日付を取得しますが、NULL値は結果セットの一番下にあります。

null値を最上位に表示できるようにクエリを構造化する方法はありますか?また、日付値がある場合は、それらを最近のものから古いものに降順で並べ替えることができますか?

答えて

85

@Chris、あなたはほとんどそれを持っています。

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

[編集:#Eppzは、現在示さ上記のコードを微調整するために私に尋ねた]

私は個人的には「マジックナンバー」を作成するより多くの方にこれを好みます。マジックナンバーは、ほとんどの場合、起こるのを待っている問題です。

+4

なぜDESCに気をつけますか? 0と1を切り替えてください。 –

+0

明らかに、編集内容を可能な限りChrisの提案に近づけようとしていました。 –

+0

私は実際にはそれがsql2000のために見えるタグを見ていない。 MySQLはMySQLで動作するはずです。 :) –

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

+0

ケースの代わりにこのソリューションを使用します。 – Ionic

+0

LINQで簡単に使用できる – yoohoo

21

これが一番下にNULLのを置くようにあなたは何かを行うことができます:

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

+1これはAccess SQLで私にとって働いた唯一の答えでした。 –

+1

これはSQLiteでも同様に機能しました。 – IAmKale

+0

あなたは四角いカッコがある理由はありますか? – AndrewBramwell

0

この

は、B、C、[提出日を選択してみてください] FROM someView ORDER BY isnull([Submissi ( '1770/01/01'はdatetimeとして)ASC

+1

キャスト( '2079/01/01'としてdatetime)部分をありがとう! – Sadegh

14

標準SQLには(ISO/IEC 9075から2:2003以降 - 2008年)のために用意されています

ORDER BY SomeColumn NULLS FIRST 

ほとんどのDBMSは、実際には私の知る限り、まだこの機能をサポートしていません。

+1

このヒントありがとう、Oracle 11gで動作します。 –

+2

PostgreSQL 9.2.1でも動作します。 –

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 
+1

この単純化は、今日の日付または将来の日付のレコードがある場合はそのまま動作しません。その場合は、GETDATE()からDATEADD()に変更して、現在の日付にあまりにも多くの日数または年数を追加することができます。 – nconantj

関連する問題