PostgreSQL implementa tuplas muy a fondo (a diferencia de las implementaciones medias que se encuentran en Oracle, DB2, SQL Server, etc.). Puedes escribir tu condición usando "desigualdad de tuplas", como en:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Tenga en cuenta que dado que la segunda columna está en orden descendente, debe "invertir" su valor durante la comparación. Por eso se expresa como -b
y también, -20
. Esto puede ser complicado para columnas no numéricas como fechas, varchars, LOB, etc.
Finalmente, el uso de un índice todavía es posible con -b
valor de columna si crea un índice ad-hoc, como:
create index ix1 on table1 (a, (-b), c);
Sin embargo, nunca puede obligar a PostgreSQL a usar un índice. SQL es un lenguaje declarativo, no imperativo. Puedes atraer hacerlo manteniendo actualizadas las estadísticas de la tabla y también seleccionando un pequeño número de filas. Si su LIMIT
es demasiado grande, es posible que PostgreSQL se incline a usar un escaneo de tabla completo en su lugar.