sql >> Databasteknik >  >> RDS >> PostgreSQL

Tidsbaserad prioritet i Active Record Query

Till skillnad från vissa andra databaser (som Oracle) har PostgreSQL en fullt fungerande boolean typ. Du kan använda det direkt i en ORDER BY sats utan att tillämpa en CASE uttalande - de är bra för mer komplexa situationer.

Sorteringsordning för boolean värden är:

FALSE -> TRUE -> NULL

Om du ORDER BY bool_expression DESC , inverterar du ordningen till:

NULL -> TRUE -> FALSE

Om du vill ha TRUE först och NULL sist, använd NULLS LAST klausul i ORDER BY :

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

Naturligtvis, NULLS LAST är bara relevant om featured eller created_at kan vara NULL . Om kolumnerna är definierade NOT NULL , bry dig inte.

Dessutom FALSE skulle sorteras före NULL . Om du inte vill skilja mellan dessa två är du antingen tillbaka till ett CASE uttalande, eller så kan du lägga in NULLIF() eller COALESCE() .

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

Prestanda

Obs, hur jag använde:

created_at > now() - interval '11 days'

och inte :

now() - created_at < interval '11 days'

I det första exemplet är uttrycket till höger en konstant som beräknas en gång . Sedan kan ett index användas för att slå upp matchande rader. Mycket effektivt.

Det senare kan vanligtvis inte användas med ett index. Ett värde måste beräknas för varje enskild rad innan det kan kontrolleras mot det konstanta uttrycket till höger. Gör inte detta om du kan undvika det. Någonsin!



  1. Felsöka disk I/O-flaskhalsar

  2. oracle SQL hur man tar bort tid från datum

  3. Hur man skapar en kolumn som inte är null i en vy

  4. Installera och anslut till PostgreSQL 10 på Ubuntu 16.04