PostgreSQL implémente les tuples de manière très approfondie (contrairement aux demi-implémentations trouvées dans Oracle, DB2, SQL Server, etc.). Vous pouvez écrire votre condition en utilisant "l'inégalité des tuples", comme dans :
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Veuillez noter que puisque la deuxième colonne est en ordre décroissant, vous devez "inverser" sa valeur lors de la comparaison. C'est pourquoi il est exprimé sous la forme -b
et aussi, -20
. Cela peut être délicat pour les colonnes non numériques telles que les dates, les varchars, les LOB, etc.
Enfin, l'utilisation d'un index est toujours possible avec le -b
valeur de la colonne si vous créez un index ad hoc, tel que :
create index ix1 on table1 (a, (-b), c);
Cependant, vous ne pouvez jamais forcer PostgreSQL à utiliser un index. SQL est un langage déclaratif et non impératif. Vous pouvez attirer pour le faire en gardant les statistiques de la table à jour, et aussi en sélectionnant un petit nombre de lignes. Si votre LIMIT
est trop grand, PostgreSQL peut être enclin à utiliser une analyse complète de la table à la place.