Tôi vừa thực hiện một tùy chọn dành riêng cho PostgreSQL cho việc này. Đó là một chút hack, đi kèm với những ưu và nhược điểm và hạn chế riêng của nó, nhưng nó dường như hoạt động và không giới hạn ở một ngôn ngữ phát triển, nền tảng hoặc trình điều khiển PG cụ thể.
Thủ thuật tất nhiên là tìm cách vượt qua một tập hợp các giá trị độ dài tùy ý dưới dạng một tham số duy nhất và để db nhận ra nó là nhiều giá trị. Giải pháp tôi đang làm là xây dựng một chuỗi được phân tách từ các giá trị trong bộ sưu tập, chuyển chuỗi đó thành một tham số duy nhất và sử dụng chuỗi_to_array () với phép truyền cần thiết cho PostgreQuery để sử dụng đúng cách.
Vì vậy, nếu bạn muốn tìm kiếm "foo", "blah" và "abc", bạn có thể ghép chúng lại với nhau thành một chuỗi như: 'foo, blah, abc'. Đây là SQL thẳng:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Rõ ràng là bạn sẽ thay đổi biểu mẫu rõ ràng thành bất cứ thứ gì bạn muốn mảng giá trị kết quả của bạn là - int, text, uuid, v.v. Và bởi vì hàm đang lấy một giá trị chuỗi đơn (hoặc hai tôi cho rằng, nếu bạn muốn tùy chỉnh dấu phân cách cũng vậy), bạn có thể truyền nó dưới dạng tham số trong câu lệnh đã chuẩn bị:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Điều này thậm chí đủ linh hoạt để hỗ trợ những thứ như so sánh THÍCH:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Một lần nữa, không có câu hỏi nào là hack, nhưng nó hoạt động và cho phép bạn vẫn sử dụng các câu lệnh được chuẩn bị trước được biên dịch sẵn * ahem * các tham số rời rạc , với các lợi ích bảo mật và (có thể) hiệu suất đi kèm. Có nên và thực sự hiệu quả? Tất nhiên, điều đó phụ thuộc, vì bạn đã phân tích chuỗi và có thể truyền diễn ra trước khi truy vấn của bạn thậm chí chạy. Nếu bạn đang mong đợi gửi ba, năm, vài chục giá trị, chắc chắn, nó có thể tốt. Vài ngàn? Vâng, có lẽ không quá nhiều. YMMV, giới hạn và loại trừ được áp dụng, không có bảo hành rõ ràng hay ngụ ý.
Nhưng nó đã có tác dụng.