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!