67

I have a stored procedure which executes a select statement. I would like my results ordered by a date field and display all records with NULL dates first and then the most recent dates.

The statement looks like this:

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

Now this will display all records with NULL Submission Dates first, but when I get to rows that have date values in them, they are not the most recent dates in the view.

If I replace ASC with DESC, then I get the dates in the the order I want, but the NULL values are at the bottom of my result set.

Is there any way to structure my query so that I can display the null values at the top and then when there are date values, to order them descending most recent to oldest?

Eppz
  • 3,178
  • 2
  • 19
  • 26

9 Answers9

120

@Chris, you almost have it.

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

[Edit: #Eppz asked me to tweak the code above as currently shown]

I personally prefer this a lot better than creating "magic numbers". Magic numbers are almost always a problem waiting to happen.

Euro Micelli
  • 33,285
  • 8
  • 51
  • 70
  • 4
    Why bother with DESC? Just switch your 0 and 1. – Joel Coehoorn May 04 '09 at 20:26
  • Clearly, but I was trying to keep my edits as close to Chris' suggestion as possible. – Euro Micelli May 04 '09 at 20:37
  • I actually didn't look at the tags to see it was for sql2000. Mine should work in MySQL. :) – Chris Bartow May 04 '09 at 21:17
  • @Chris: yeah, I've done that before. Why don't you edit your post to note that? Nothing wrong with posting the syntax under other flavors of SQL. – Euro Micelli May 04 '09 at 21:22
  • Thanks for the answer. I got it to work by using this solution, please edit your code to look like this: ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, [Submission Date] DESC – Eppz May 05 '09 at 12:55
  • Eppz, I changed the code as you requested. BTW, it would be Ok for you to tweak my posting yourself to fit your needs. I certainly wouldn't mind and it's well within the spirit of SO. – Euro Micelli May 05 '09 at 16:29
  • @Euro Micelli, I don't have a high enough rep to edit your post yet. So please vote up my question <3 – Eppz May 05 '09 at 17:20
28

You can do something like this put the NULL's at the bottom:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
Chris Bartow
  • 14,873
  • 11
  • 43
  • 46
20

Standard SQL (ISO/IEC 9075-2:2003 or later - 2008) provides for:

ORDER BY SomeColumn NULLS FIRST

Most DBMS do not actually support this yet, AFAIK.

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
3

try

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

I know this is old, but when I found it I noticed the accepted solution, https://stackoverflow.com/a/821856/7177892, could be simplified by making the result of the CASE statement be either today (GETDATE()) or the actual date.

Original:

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

Simplified:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
               THEN GETDATE() 
               ELSE [Submission Date] 
          END) DESC
Community
  • 1
  • 1
nconantj
  • 11
  • 2
  • 2
    This simplification won't work as-is if you have records with today's date or future dates. In that case, you could change from GETDATE() to DATEADD() and add some obscenely large number of days or years to the current date. – nconantj Nov 18 '16 at 11:38
1

I have another suggestion that might be simpler than all the others:

For SQL Server, most of the options don't work, except the case ones.

I found that this actually works great to me: ORDER BY ISNULL(Submission_Date, GETDATE()) DESC

In the order bit of the query, I assign the GETDATE() value to the Submittion_Date values that are null, and the order comes out correctly.

cs95
  • 379,657
  • 97
  • 704
  • 746
Marco Leite
  • 88
  • 1
  • 1
  • 7
0

Assuming Submission Date less than current date-time

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY ISNULL([Submission Date], GETDATE()) DESC
han
  • 118
  • 1
  • 11
0

try this

SELECT a,b,c,[Submission Date] FROM someView ORDER BY isnull([Submission Date] ,cast('1770/01/01' as datetime)) ASC

littlechris
  • 4,174
  • 10
  • 43
  • 66