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

Tidsbaseret prioritet i Active Record Query

I modsætning til nogle andre databaser (som Oracle) har PostgreSQL en fuldt funktionel boolean type. Du kan bruge det direkte i en ORDER BY klausul uden at anvende en CASE statement - de er gode til mere komplekse situationer.

Sorteringsrækkefølge for boolean værdier er:

FALSE -> TRUE -> NULL

Hvis du ORDER BY bool_expression DESC , inverterer du rækkefølgen til:

NULL -> TRUE -> FALSE

Hvis du vil have TRUE først og NULL sidst, brug NULLS LAST klausul i ORDER BY :

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

Naturligvis NULLS LAST er kun relevant, hvis featured eller created_at kan være NULL . Hvis kolonnerne er defineret NOT NULL , så gider du ikke.

Også FALSE ville blive sorteret før NULL . Hvis du ikke ønsker at skelne mellem disse to, er du enten tilbage til en CASE sætning, eller du kan smide NULLIF() ind eller COALESCE() .

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

Ydeevne

Bemærk, hvordan jeg brugte:

created_at > now() - interval '11 days'

og ikke :

now() - created_at < interval '11 days'

I det første eksempel er udtrykket til højre en konstant, der beregnes en gang . Derefter kan et indeks bruges til at slå matchende rækker op. Meget effektiv.

Sidstnævnte kan normalt ikke bruges med et indeks. En værdi skal beregnes for hver enkelt række, før den kan kontrolleres mod det konstante udtryk til højre. Gør ikke dette, hvis du kan undgå det. Nogensinde!



  1. Opret et forhold i SQL

  2. Fejl:ORA-01704:streng for lang

  3. Antal læste rækker / Faktiske rækker Læs advarsler i Plan Explorer

  4. Hvordan kan jeg kombinere flere rækker til en kommasepareret liste i Oracle?