Сортувати за стовпцем ASC, але спочатку значення NULL?


81

Мені потрібно відсортувати таблицю PostgreSQL за зростанням за полем дати / часу, наприклад last_updated.

Але це поле може бути порожнім або нульовим, і я хочу, щоб записи з null last_updatedвходили перед non-null last_updated.
Чи можливо це?

order by last_updated asc  -- and null last_updated records first ??

про всяк випадок: postgresql.org/docs/9.0/static/queries-order.html
mhd

Відповіді:


165

Postgres надає NULLS FIRST | LASTключові слова для цього ORDER BYпункту, щоб задовольнити саме ці потреби:

... ORDER BY last_updated NULLS FIRST

Типовий випадок використання з низхідним порядком сортування ( DESC), що дає повну інверсію порядку зростання за замовчуванням ( ASC) зі значеннями нульових першими. Часто не бажано - отже, щоб останнє значення null було останнім:

... ORDER BY last_updated DESC NULLS LAST

Щоб підтримати запит індексом , зробіть його відповідним:

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

Postgres може читати індекси btree назад, але це має значення, де додаються значення NULL.


1
@mhd Ви не шукали в Google для "postgres sort null first"?
Девід Олдрідж,

28
Я зробила. Ось так я отримав цю сторінку :)
ibrewster

2
Дякуємо за вашу відповідь, PostgreSQL чудовий.
greatghoul

1
Дякую за відповідь. SQLite3 додав цю функцію, і перед використанням я хотів переконатися, що вона буде сумісна з PostgreSQL. Виявляється, це стандартна справа в наші дні!
Бред

13

Ви можете створити власне ЗАМОВЛЕННЯ, використовуючи оператор CASE.
Оператор CASE перевіряє ваш стан і призначає рядкам, які відповідають цій умові, нижче значення, ніж те, що присвоєно рядкам, які не відповідають умові.
Це, мабуть, найпростіше зрозуміти на прикладі:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;

1
Крім того, але ви, мабуть, це знаєте, ASCє типовим порядком сортування, тому вам не обов’язково вводити його.
mechanical_meat

3
NULLS FIRSTтакож є сумісним з ANSI способом спочатку писати нулі.
a_horse_with_no_name

3
@a_horse_with_no_name Це корисно в моєму випадку, оскільки я хочу ігнорувати значення, якщо воно не є нульовим, а потім відсортувати за іншим стовпцем. (Сповіщення про сортування - спочатку невидимі (тоді seenAt is null), але якщо їх бачити, то я сортую за встановленими createdAtставками)
KajMagnus

3
Погоджено; Я знайшов це корисним, коли просто хотів відсортувати за наявністю значення чи ні (у даному випадку - датою), а потім сортував за іншим значенням вторинно. NULLS FIRSTяк і раніше сортується за фактичним значенням, якщо значення було ненульовим. Це зробило для мене фокус. Дякую!
Бен Крігер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.