PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Priorytet oparty na czasie w zapytaniu Active Record

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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL, aby uzyskać wszystkie wartości, jakie może mieć wyliczenie

  2. Postgresql Drop View

  3. PostgreSQL + Hibernate + Spring automatyczne tworzenie bazy danych

  4. Nie można połączyć PostgreSQL ze zdalną bazą danych za pomocą pgAdmin

  5. Najszybsze sprawdzenie, czy wiersz istnieje w PostgreSQL