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!