W przeciwieństwie do niektórych innych baz danych (takich jak Oracle) PostgreSQL ma w pełni funkcjonalny boolean
rodzaj. Możesz z niego korzystać bezpośrednio w ORDER BY
klauzula bez stosowania CASE
oświadczenie – świetnie sprawdzają się w bardziej złożonych sytuacjach.
Kolejność sortowania dla boolean
wartości to:
FALSE -> TRUE -> NULL
Jeśli ORDER BY bool_expression
DESC
, odwracasz kolejność do:
NULL -> TRUE -> FALSE
Jeśli chcesz TRUE
pierwszy i NULL
na koniec użyj NULLS LAST
klauzula ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Oczywiście NULLS LAST
ma znaczenie tylko wtedy, gdy featured
lub created_at
może być NULL
. Jeśli kolumny są zdefiniowane NOT NULL
, to nie zawracaj sobie głowy.
Również FALSE
zostanie posortowany przed NULL
. Jeśli nie chcesz rozróżniać między tymi dwoma, albo wracasz do CASE
oświadczenie, lub możesz wrzucić NULLIF()
lub COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Wydajność
Zwróć uwagę, jak użyłem:
created_at > now() - interval '11 days'
i nie :
now() - created_at < interval '11 days'
W pierwszym przykładzie wyrażenie po prawej stronie jest stałą obliczaną raz . Następnie można wykorzystać indeks do wyszukiwania pasujących wierszy. Bardzo wydajny.
Ten ostatni zwykle nie może być używany z indeksem. Wartość musi zostać obliczona dla każdego wiersza, zanim będzie można ją sprawdzić względem wyrażenia stałego po prawej stronie. Nie rób tego, jeśli możesz tego uniknąć. Kiedykolwiek!