views:

930

answers:

5

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)?

A: 

try

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
Adinochestva
9999/99/99 with throw an error as it cannot be parsed to a date.
Eppz
+4  A: 

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
A: 

try this

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

littlechris
thank you for cast('2079/01/01' as datetime) part !
Adinochestva
+4  A: 

@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
Why bother with DESC? Just switch your 0 and 1.
Joel Coehoorn
Clearly, but I was trying to keep my edits as close to Chris' suggestion as possible.
Euro Micelli
I actually didn't look at the tags to see it was for sql2000. Mine should work in MySQL. :)
Chris Bartow
@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
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
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
@Euro Micelli, I don't have a high enough rep to edit your post yet. So please vote up my question <3
Eppz
A: 

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