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