Почему значения NULL стоят первыми при упорядочении DESC в запросе PostgreSQL?
Когда вы когда-нибудь захотите сначала получить NULLS при заказе запроса по убыванию или по возрастанию?
На мой взгляд, в подавляющем большинстве случаев желаемое поведение, будь то сортировка по возрастанию или по убыванию, будет NULLS LAST. Вместо этого мы должны указать NULLS FIRST.
2 ответа
На самом деле, с порядком сортировки по умолчанию (ASCENDING
) NULL значения идут последними.
Логика диктует, что порядок сортировки будет изменен с DESCENDING
ключевое слово, поэтому в этом случае на первом месте стоят NULL.
Но лучшая часть приходит последней: вы можете выбрать, какой вы хотите:
- Использовать
NULLS FIRST | LAST
пункт.
Цитирую текущее руководство, версия 9.3 на момент написания:
Если
NULLS LAST
указано, нулевые значения сортируются после всех ненулевых значений; еслиNULLS FIRST
указано, нулевые значения сортируются перед всеми ненулевыми значениями. Если ни то, ни другое не указано, поведение по умолчаниюNULLS LAST
когдаASC
указан или подразумевается, иNULLS FIRST
когдаDESC
указано (таким образом, по умолчанию действует так, как будто значения NULL больше, чем значения NULL). когдаUSING
указано, порядок нуля по умолчанию зависит от того, является ли оператор оператором меньше или больше.
Жирный акцент мой.
Простой ответ заключается в том, что именно так люди, которые написали Postgres, создали его. Цитировать:
Нулевое значение сортируется выше, чем любое другое значение. Другими словами, при возрастающем порядке сортировки нулевые значения сортируются в конце, а при убывающем порядке сортировки нулевые значения сортируются в начале.
Это предполагает, что вы указали предложение ORDERBY, если нет, то строки возвращаются случайным образом.
Если указано предложение ORDERBY, возвращаемые строки сортируются в указанном порядке. Если ORDERBY не указан, строки возвращаются в любом порядке, который система сочтет наиболее быстрым.