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

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

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

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

2 ответа

Решение

PostgreSQL предоставляет 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.

Вы можете создать пользовательский 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;
Другие вопросы по тегам