Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort by column ASC, but NULL values first?

I need to sort a PostgreSQL table ascending by a date/time field, e.g. last_updated.

But that field is allowed to be empty or null and I want records with null in last_updated come before non-null last_updated.
Is this possible?

order by last_updated asc  -- and null last_updated records first ?? 
like image 767
mhd Avatar asked Mar 01 '12 04:03

mhd


2 Answers

Postgres has the NULLS FIRST | LAST modifiers for ORDER BY expression:

... ORDER BY last_updated NULLS FIRST 

The typical use case is with descending sort order (DESC), which produces the complete inversion of the default ascending order (ASC) with null values first - which is often not desirable. To sort NULL values last:

... ORDER BY last_updated DESC NULLS LAST 

To support the query with an index, make it match:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST); 

Postgres can read btree indexes backwards, but for some query plans it matters where NULL values are appended. See:

  • Performance impact of view on aggregate function vs result set limiting
like image 50
Erwin Brandstetter Avatar answered Sep 22 '22 12:09

Erwin Brandstetter


You can create a custom ORDER BY using a CASE statement.
The CASE statement checks for your condition and assigns to rows which meet that condition a lower value than that which is assigned to rows which do not meet the condition.
It's probably easiest to understand given an example:

  SELECT last_updated      FROM your_table  ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END,           last_updated ASC; 
like image 37
mechanical_meat Avatar answered Sep 22 '22 12:09

mechanical_meat