質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top