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!