Sort by column ASC, but NULL values first?

后端 未结 2 1155
北荒
北荒 2020-11-22 00:55

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 wi

相关标签:
2条回答
  • 2020-11-22 00:58

    Postgres provides the NULLS FIRST | LAST keywords for the ORDER BY clause to cater for that need exactly:

    ... ORDER BY last_updated NULLS FIRST
    

    A typical use case is with descending sort order (DESC), which yields the complete inversion of the default ascending order (ASC) with null values first. Often not desirable - so, to keep 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 it matters where NULL values are appended.

    0 讨论(0)
  • 2020-11-22 01:17

    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;
    
    0 讨论(0)
提交回复
热议问题