I modsætning til nogle andre databaser (som Oracle) har PostgreSQL en fuldt funktionel boolean
type. Du kan bruge det direkte i en ORDER BY
klausul uden at anvende en CASE
statement - de er gode til mere komplekse situationer.
Sorteringsrækkefølge for boolean
værdier er:
FALSE -> TRUE -> NULL
Hvis du ORDER BY bool_expression
DESC
, inverterer du rækkefølgen til:
NULL -> TRUE -> FALSE
Hvis du vil have TRUE
først og NULL
sidst, brug NULLS LAST
klausul i ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Naturligvis NULLS LAST
er kun relevant, hvis featured
eller created_at
kan være NULL
. Hvis kolonnerne er defineret NOT NULL
, så gider du ikke.
Også FALSE
ville blive sorteret før NULL
. Hvis du ikke ønsker at skelne mellem disse to, er du enten tilbage til en CASE
sætning, eller du kan smide NULLIF()
ind eller COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Ydeevne
Bemærk, hvordan jeg brugte:
created_at > now() - interval '11 days'
og ikke :
now() - created_at < interval '11 days'
I det første eksempel er udtrykket til højre en konstant, der beregnes en gang . Derefter kan et indeks bruges til at slå matchende rækker op. Meget effektiv.
Sidstnævnte kan normalt ikke bruges med et indeks. En værdi skal beregnes for hver enkelt række, før den kan kontrolleres mod det konstante udtryk til højre. Gør ikke dette, hvis du kan undgå det. Nogensinde!