sql >> Databáze >  >> RDS >> PostgreSQL

Časová priorita v Active Record Query

Na rozdíl od některých jiných databází (jako je Oracle) má PostgreSQL plně funkční boolean typ. Můžete jej použít přímo v ORDER BY klauzule bez použití CASE prohlášení – jsou skvělé pro složitější situace.

Pořadí řazení pro boolean hodnoty je:

FALSE -> TRUE -> NULL

Pokud ORDER BY bool_expression DESC , převrátíte pořadí na:

NULL -> TRUE -> FALSE

Pokud chcete TRUE první a NULL nakonec použijte NULLS LAST klauzule ORDER BY :

ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST  
       , created_at DESC

Samozřejmě, NULLS LAST je relevantní pouze v případě, že je featured nebo created_at může být NULL . Pokud jsou sloupce definovány NOT NULL , pak se neobtěžujte.

Také FALSE by byly seřazeny před NULL . Pokud mezi těmito dvěma nechcete rozlišovat, buď jste zpět v CASE nebo můžete vložit NULLIF() nebo COALESCE() .

ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
                                                                DESC NULLS LAST
       , created_at DESC

Výkon

Všimněte si, jak jsem použil:

created_at > now() - interval '11 days'

a ne :

now() - created_at < interval '11 days'

V prvním příkladu je výraz vpravo konstanta, která se vypočítá jednou . Potom lze index použít k vyhledání odpovídajících řádků. Velmi efektivní.

Ten nelze obvykle použít s indexem. Hodnota musí být spočítána pro každý jednotlivý řádek, než může být porovnána s konstantním výrazem vpravo. Nedělejte to, pokud se tomu můžete vyhnout. Nikdy!



  1. mysql_fetch_array, mysql_fetch_assoc, mysql_fetch_object

  2. Jak nastavit výchozí uživatelské heslo v PostgreSQL

  3. Kritéria hibernace pro data

  4. PL/SQL, jak uniknout jednoduchým uvozovkám v řetězci?