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!