sql >> Database >  >> RDS >> PostgreSQL

Op tijd gebaseerde prioriteit in Active Record Query

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!



  1. Wat is de juiste JDBC URL-syntaxis als Oracle-wallets worden gebruikt?

  2. Zoek laatste rij in groep op query-SQL Server

  3. PostgreSQL-triggers en basisfuncties voor opgeslagen functies

  4. Oracle DB Server + APEX + ORDS + JasperReports from scratch (Deel 4)