Сортировка PostgreSQL по дате времени asc, null сначала?

Мне нужно отсортировать таблицу PostgreSQL, восходящую по дате/времени, например. last_updated.

Но это поле разрешено быть пустым или нулевым, и я хочу, чтобы записи с нулевым значением в last_updated приходили до ненулевого last_updated.
Возможно ли это?

order by last_updated asc /* and null last_updated records first ?? */

Ответ 1

Postgres обеспечивает NULLS FIRST | LAST NULLS FIRST | LAST ключевые слова для предложения ORDER BY для удовлетворения этой потребности точно:

... ORDER BY last_updated NULLS FIRST

Типичный вариант использования - с нисходящим порядком сортировки (DESC), который дает полную инверсию по умолчанию в порядке возрастания (ASC) с нулевыми значениями в первую очередь Часто это нежелательно - поэтому сохранять нулевые значения последними:

... ORDER BY last_updated DESC NULLS LAST

Чтобы поддержать запрос с индексом, сделайте так, чтобы он соответствовал:

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

Postgres может читать индексы btree в обратном направлении, но имеет значение, куда добавляются значения NULL.

Ответ 2

Вы можете создать пользовательский ORDER BY, используя оператор CASE.
Оператор CASE проверяет ваше условие и присваивает строкам, которые соответствуют этому условию, меньшее значение, чем значение, которое присваивается строкам, которые не соответствуют этому условию.
Это, вероятно, проще всего понять на примере:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;