Сортировка 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;