NULLを最初に示し、次に最新の日付を示すORDER BY DATE
-
03-07-2019 - |
質問
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、[提出日] から 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