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!