web-dev-qa-db-ja.com

NULLを最初に、次に最新の日付を示すORDER BY DATE

Selectステートメントを実行するストアドプロシージャがあります。結果を日付フィールドで並べ、最初にNULLの日付を持つレコードを表示し、次に最新の日付を表示したいと思います。

ステートメントは次のようになります。

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

これにより、最初にNULL提出日を持つすべてのレコードが表示されますが、日付値が含まれる行に到達すると、それらはビューの最新の日付ではありません。

ASCをDESCに置き換えると、希望する順序で日付が取得されますが、NULL値は結果セットの下部にあります。

クエリを構造化する方法はありますか。その結果、一番上にnull値を表示し、日付値がある場合に、最新のものから古いものへと降順で並べることができますか?

58
Eppz

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

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

[編集:#Eppzは、現在表示されているように上記のコードを調整するように依頼しました]

個人的には、「マジックナンバー」を作成するよりもずっとこのほうが好きです。マジックナンバーは、ほとんどの場合、発生を待つ問題です。

102
Euro Micelli

このような何かを行うことができますNULLを下に置く:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
25
Chris Bartow

標準SQL(ISO/IEC 9075-2:2003以降-2008)は以下を提供します。

ORDER BY SomeColumn NULLS FIRST

ほとんどのDBMSは実際にはまだこれをサポートしていません。

17

試してみる

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
3
Sadegh
OrderBy="ColumnName = NULL desc, ColumnName desc"
1
Paul

これを試して

SELECT a、b、c、[提出日] FROM someView ORDER BY isnull([提出日]、cast( '1770/01/01' as datetime))ASC

0
littlechris

私はこれが古いことを知っていますが、それを見つけたとき、受け入れられた解決策に気付きました 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
0
nconantj

他のすべてのものよりも簡単な別の提案があります:

SQL Serverの場合、ケースオプションを除き、ほとんどのオプションは機能しません。

私はこれが実際に私にとって素晴らしいことを見つけました:ORDER BY ISNULL(Submission_Date、GETDATE())DESC

クエリの順序ビットで、GETDATE()の値をnullのSubmittion_Dateの値に割り当て、順序が正しく表示されます。

0
Marco Leite