Сортировка значений NULL в конец таблицы

95

Есть ли способ с PostgreSQL сортировать строки со NULLзначениями в полях до конца выбранной таблицы?

Подобно:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END
привет
источник

Ответы:

172

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

Вопрос касается нисходящего порядка, который является идеальным обратным и , таким образом сортирует значения NULL первым. Решение @Mosty Указал было введено с PostgreSQL 8.3 :

ORDER BY somevalue DESC NULLS LAST

Для PostgreSQL 8.2 и старше или других СУБД без этой стандартной функции SQL вы можете заменить:

ORDER BY (somevalue IS NULL), somevalue DESC

FALSEсортируется раньше TRUE, поэтому значения NULL идут последними, как в примере выше.

Связанный позже ответ:

Эрвин Брандштеттер
источник
2
ИМХО в большинстве приложений реального мира вам нужно, чтобы нулевые значения продолжались независимо от порядка. Например, сортировка DESC по необязательной метке времени, имени, фамилии ... так что я нахожу это действительно подозрительным, хотя кажется логичным, что математически порядок DESC противоположен ASC. Может быть, нули просто должны быть в отдельной категории и не должны подвергаться влиянию ASC, DESC и всегда ставиться последними, это было бы лучшим вариантом по умолчанию.
Кристоф Русси
Это может повлиять на индексы, если они DESC. Может быть, вы тоже можете добавить примечание об этом? postgresql.org/message-id/…
Кристоф Русси
@ChristopheRoussy: индексы, соответствующие порядку сортировки, затронуты в связанном ответе выше.
Эрвин Брандштеттер,
3
Лично я считаю, что по умолчанию должно было быть наоборот: NULL идут сначала в порядке возрастания, а последними - в порядке убывания. Это гораздо более интуитивно понятно, поскольку NULL - это «наименьшее» значение.
Стивен
1
Для людей, пришедших с MYSQL, это лол? Почему он был построен именно так? ИЛИ Mysql чрезмерно оптимизировал результат
CodeGuru