Till skillnad från vissa andra databaser (som Oracle) har PostgreSQL en fullt fungerande boolean
typ. Du kan använda det direkt i en ORDER BY
sats utan att tillämpa en CASE
uttalande - de är bra för mer komplexa situationer.
Sorteringsordning för boolean
värden är:
FALSE -> TRUE -> NULL
Om du ORDER BY bool_expression
DESC
, inverterar du ordningen till:
NULL -> TRUE -> FALSE
Om du vill ha TRUE
först och NULL
sist, använd NULLS LAST
klausul i ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Naturligtvis, NULLS LAST
är bara relevant om featured
eller created_at
kan vara NULL
. Om kolumnerna är definierade NOT NULL
, bry dig inte.
Dessutom FALSE
skulle sorteras före NULL
. Om du inte vill skilja mellan dessa två är du antingen tillbaka till ett CASE
uttalande, eller så kan du lägga in NULLIF()
eller COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Prestanda
Obs, hur jag använde:
created_at > now() - interval '11 days'
och inte :
now() - created_at < interval '11 days'
I det första exemplet är uttrycket till höger en konstant som beräknas en gång . Sedan kan ett index användas för att slå upp matchande rader. Mycket effektivt.
Det senare kan vanligtvis inte användas med ett index. Ett värde måste beräknas för varje enskild rad innan det kan kontrolleras mot det konstanta uttrycket till höger. Gör inte detta om du kan undvika det. Någonsin!