Selectステートメントを実行するストアドプロシージャがあります。結果を日付フィールドで並べ、最初にNULLの日付を持つレコードを表示し、次に最新の日付を表示したいと思います。
ステートメントは次のようになります。
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC
これにより、最初にNULL提出日を持つすべてのレコードが表示されますが、日付値が含まれる行に到達すると、それらはビューの最新の日付ではありません。
ASCをDESCに置き換えると、希望する順序で日付が取得されますが、NULL値は結果セットの下部にあります。
クエリを構造化する方法はありますか。その結果、一番上にnull値を表示し、日付値がある場合に、最新のものから古いものへと降順で並べることができますか?
@クリス、あなたはほとんどそれを持っています。
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
[編集:#Eppzは、現在表示されているように上記のコードを調整するように依頼しました]
個人的には、「マジックナンバー」を作成するよりもずっとこのほうが好きです。マジックナンバーは、ほとんどの場合、発生を待つ問題です。
このような何かを行うことができますNULLを下に置く:
ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
標準SQL(ISO/IEC 9075-2:2003以降-2008)は以下を提供します。
ORDER BY SomeColumn NULLS FIRST
ほとんどのDBMSは実際にはまだこれをサポートしていません。
試してみる
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
OrderBy="ColumnName = NULL desc, ColumnName desc"
これを試して
SELECT a、b、c、[提出日] FROM someView ORDER BY isnull([提出日]、cast( '1770/01/01' as datetime))ASC
私はこれが古いことを知っていますが、それを見つけたとき、受け入れられた解決策に気付きました 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
他のすべてのものよりも簡単な別の提案があります:
SQL Serverの場合、ケースオプションを除き、ほとんどのオプションは機能しません。
私はこれが実際に私にとって素晴らしいことを見つけました:ORDER BY ISNULL(Submission_Date、GETDATE())DESC
クエリの順序ビットで、GETDATE()の値をnullのSubmittion_Dateの値に割り当て、順序が正しく表示されます。