PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Priorità basata sul tempo in Active Record Query

A differenza di altri database (come Oracle) PostgreSQL ha un boolean completamente funzionale genere. Puoi usarlo direttamente in un ORDER BY clausola senza applicare un CASE dichiarazione:sono ottimi per le situazioni più complesse.

Ordina per boolean valori è:

FALSE -> TRUE -> NULL

Se ORDER BY bool_expression DESC , inverti l'ordine in:

NULL -> TRUE -> FALSE

Se vuoi TRUE prima e NULL infine, usa il NULLS LAST clausola di ORDER BY :

ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST  
       , created_at DESC

Naturalmente, NULLS LAST è rilevante solo se featured o created_at può essere NULL . Se le colonne sono definite NOT NULL , quindi non preoccuparti.

Inoltre, FALSE verrebbe ordinato prima di NULL . Se non vuoi distinguere tra questi due, sei tornato a un CASE oppure puoi inserire NULLIF() o COALESCE() .

ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
                                                                DESC NULLS LAST
       , created_at DESC

Prestazioni

Nota, come ho usato:

created_at > now() - interval '11 days'

e non :

now() - created_at < interval '11 days'

Nel primo esempio, l'espressione a destra è una costante che viene calcolata una volta . Quindi è possibile utilizzare un indice per cercare le righe corrispondenti. Molto efficiente.

Quest'ultimo di solito non può essere utilizzato con un indice. È necessario calcolare un valore per ogni singola riga, prima di poterlo confrontare con l'espressione costante a destra. Non farlo se puoi evitarlo. Mai!