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!