Truy vấn:
SELECT * FROM table WHERE ? LIKE (col || '%');
có thể được viết lại thành (Postgres và MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Như đã nhận xét, biểu mẫu đầu tiên cũng hoạt động tốt. Tuy nhiên, nó có thể phức tạp vì các ký tự có ý nghĩa đặc biệt cho LIKE
(ít nhất _%\
) trong cột sẽ phải được trốn thoát. Nếu bạn muốn nó hoạt động với cả MySQL và Postgres, bạn sẽ phải quan sát các ký tự đặc biệt trong cả hai cách triển khai. Vì vậy, dạng thứ 2 ít bị lỗi hơn nhiều về tiền gốc.
Hiệu suất
Cả hai truy vấn này đều không thể sử dụng chỉ mục trên col
, cả hai đều không sargable
. Có thể đánh giá lại vấn đề khi tìm tất cả các tiền tố có thể có cho mẫu tìm kiếm đã cho ?
, có thể được tối ưu hóa theo cách tương tự như trong câu trả lời liên quan này (dành cho Postgres) trên dba.SE: