Сортировка PostgreSQL по datetime asc, сначала null? - PullRequest
66 голосов
/ 01 марта 2012

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

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

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

Ответы [ 2 ]

131 голосов
/ 01 марта 2012

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

... ORDER BY last_updated NULLS FIRST

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

... ORDER BY last_updated DESC NULLS LAST

Для поддержки запроса с index , сделать его совпадающим:

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

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

8 голосов
/ 01 марта 2012

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