PostgreSQL triển khai các bộ giá trị rất kỹ lưỡng, (không giống như một nửa các triển khai được tìm thấy trong Oracle, DB2, SQL Server, v.v.). Bạn có thể viết điều kiện của mình bằng cách sử dụng "bất đẳng thức bộ giá trị", như trong:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Xin lưu ý rằng vì cột thứ hai theo thứ tự giảm dần, bạn phải "đảo ngược" giá trị của nó trong quá trình so sánh. Đó là lý do tại sao nó được biểu thị là -b
và cả, -20
. Điều này có thể phức tạp đối với các cột không phải số như ngày tháng, véc-tơ, LOB, v.v.
Cuối cùng, vẫn có thể sử dụng chỉ mục với -b
giá trị cột nếu bạn tạo chỉ mục đặc biệt, chẳng hạn như:
create index ix1 on table1 (a, (-b), c);
Tuy nhiên, bạn không bao giờ có thể buộc PostgreSQL sử dụng một chỉ mục. SQL là một ngôn ngữ khai báo, không phải là một ngôn ngữ bắt buộc. Bạn có thể lôi kéo để làm điều đó bằng cách cập nhật số liệu thống kê của bảng và cũng bằng cách chọn một số lượng nhỏ hàng. Nếu LIMIT
của bạn quá lớn, PostgreSQL có thể có xu hướng sử dụng tính năng quét toàn bộ bảng.