PostgreSQL очень тщательно реализует кортежи (в отличие от половины реализаций, найденных в Oracle, DB2, SQL Server и т. Д.).Вы можете написать свое условие, используя «неравенство кортежей», например:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Обратите внимание, что, поскольку второй столбец находится в порядке убывания, вы должны «инвертировать» его значение во время сравнения.Вот почему оно выражается как -b
, а также -20
.Это может быть непросто для нечисловых столбцов, таких как даты, столбцы, большие объекты и т. Д.
Наконец, использование индекса со значением столбца -b
все еще возможно, если вы создаете специальный индекс, например:
create index ix1 on table1 (a, (-b), c);
Однако вы никогда не сможете заставить PostgreSQL использовать индекс.SQL является декларативным языком, а не императивным.Вы можете побудить сделать это, обновляя статистику таблицы, а также выбрав небольшое количество строк.Если ваш LIMIT
слишком большой, PostgreSQL может быть склонен использовать вместо него полное сканирование таблицы.