Почему значения NULL появляются при заказе DESC в запросе PostgreSQL?

Когда вы когда-нибудь захотите NULLS сначала при заказе нисходящего или восходящего запроса?

По-моему, подавляющее большинство того времени, когда желаемое поведение, будь то сортировка по восходящей или нисходящей, будет NULLS LAST. Вместо этого нам нужно будет указать NULLS FIRST.

Ответ 1

Собственно, с порядком сортировки по умолчанию (ASCENDING) значения NULL приходят последними.

Логика диктует, что порядок сортировки должен быть отменен с помощью ключевого слова DESCENDING, поэтому в этом случае сначала появляются NULL.

Но самая лучшая часть - последняя: вы можете выбрать способ, которым вы хотите:

Цитирование текущего руководства, версия 9.3 с момента написания:

Если указано NULLS LAST, нулевые значения сортируются после всех непустых значения; если указано NULLS FIRST, нулевые значения сортируются перед всеми ненулевые значения. Если ни один из них не указан, поведение по умолчанию NULLS LAST, когда ASC указывается или подразумевается и NULLS FIRST, когда DESC(таким образом, значение по умолчанию должно действовать так, как будто значения null больше чем ненулевые). Когда указано USING, порядок нулевых значений по умолчанию зависит от того, является ли оператор меньшим или большим, чем оператор.

Смелый акцент мой.

Ответ 2

Простой ответ объясняется тем, как это создавали люди, которые писали Postgres. Чтобы процитировать:

Значение null сортируется выше любого другого значения. Другими словами, с возрастающим порядком сортировки нулевые значения сортируются в конце, а в порядке убывания сортировки нулевые значения сортируются в начале.

Предполагается, что вы указали предложение ORDER BY, если у вас нет, то строки возвращаются случайным образом.

Если указано предложение ORDER BY, возвращаемые строки сортируются в указанном порядке. Если ORDER BY не задан, строки возвращаются в любом порядке, который система находит быстрее всего.