In tegenstelling tot sommige andere databases (zoals Oracle) heeft PostgreSQL een volledig functionele boolean
type. Je kunt het direct gebruiken in een ORDER BY
clausule zonder toepassing van een CASE
verklaring - die zijn geweldig voor meer complexe situaties.
Sorteervolgorde voor boolean
waarden is:
FALSE -> TRUE -> NULL
Als u ORDER BY bool_expression
DESC
, keert u de volgorde om naar:
NULL -> TRUE -> FALSE
Als je TRUE
. wilt eerst en NULL
gebruik als laatste de NULLS LAST
clausule van ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Natuurlijk, NULLS LAST
is alleen relevant als featured
of created_at
kan wees NULL
. Als de kolommen zijn gedefinieerd NOT NULL
, doe dan geen moeite.
Ook FALSE
zou worden gesorteerd voor NULL
. Als u geen onderscheid wilt maken tussen deze twee, bent u ofwel terug bij een CASE
statement, of je kunt NULLIF()
. invoeren of COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Prestaties
Let op, hoe ik gebruikte:
created_at > now() - interval '11 days'
en niet :
now() - created_at < interval '11 days'
In het eerste voorbeeld is de uitdrukking rechts een constante die eenmaal wordt berekend . Vervolgens kan een index worden gebruikt om overeenkomende rijen op te zoeken. Zeer efficiënt.
Dit laatste kan meestal niet worden gebruikt met een index. Voor elke rij moet een waarde worden berekend, voordat deze kan worden vergeleken met de constante uitdrukking aan de rechterkant. Doe dit niet als je het kunt vermijden. Ooit!