PostgreSQL implementa le tuple in modo molto completo (a differenza delle mezze implementazioni trovate in Oracle, DB2, SQL Server, ecc.). Puoi scrivere la tua condizione usando "tuple inequality", come in:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Si noti che poiché la seconda colonna è in ordine decrescente, è necessario "invertirne" il valore durante il confronto. Ecco perché è espresso come -b
e anche -20
. Questo può essere complicato per colonne non numeriche come date, varchars, LOB, ecc.
Infine, l'uso di un indice è ancora possibile con il -b
valore della colonna se crei un indice ad hoc, ad esempio:
create index ix1 on table1 (a, (-b), c);
Tuttavia, non puoi mai forzare PostgreSQL a utilizzare un indice. SQL è un linguaggio dichiarativo, non imperativo. Puoi attirare per farlo mantenendo aggiornate le statistiche della tabella e selezionando un numero ridotto di righe. Se il tuo LIMIT
è troppo grande, PostgreSQL potrebbe essere propenso a utilizzare invece una scansione completa della tabella.