Відсортуйте значення NULL до кінця таблиці


95

Чи є спосіб за допомогою PostgreSQL сортувати рядки зі NULLзначеннями в полях до кінця вибраної таблиці?

Люблю:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END

Відповіді:


173

По- перше, значення 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
У більшості реальних програм IMHO ви хотіли б, щоб нульові значення тривали незалежно від порядку. Наприклад, сортування DESC за необов'язковою міткою часу, ім'ям, прізвищем, ... тому я вважаю, що це дійсно підозріло, хоча здається, що має сенс, що математичний порядок DESC є протилежним ASC. Можливо, нулі просто для того, щоб потрапити до власної категорії, і на них не повинні впливати ASC, DESC і завжди ставити останніми, що було б кращим за замовчуванням.
Крістоф Руссі,

Це може вплинути на індекси, якщо вони DESC, можливо, ви також можете додати примітку про це? postgresql.org/message-id/…
Крістоф Руссі

@ChristopheRoussy: Індекси, що відповідають порядку сортування, торкаються відповіді на відповідь вище.
Ервін Брандштеттер,

3
Особисто я вважаю, що за замовчуванням могло бути навпаки: NULL стають першими у порядку зростання та останніми у порядку зменшення. Це набагато інтуїтивніше, оскільки NULL - це "найменше" значення.
Стівен

1
Для людей, які походять з MYSQL, це халтура? Чому його спочатку збудували саме так. АБО Mysql оптимізував результат
CodeGuru

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.