Заявката:
SELECT * FROM table WHERE ? LIKE (col || '%');
може да се пренапише като (Postgres и MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Както беше коментирано, първата форма също трябва да работи. Може да е трудно обаче, защото символи със специално значение за LIKE
(поне _%\
) в колоната ще трябва да се избяга. Ако искате да работи както с MySQL, така и с Postgres, ще трябва да наблюдавате специалните знаци и в двете реализации. Така че втората форма е много по-малко податлива на грешки на главница.
Ефективност
Нито една от тези заявки не може да използва индекс на col
, и двете не са саргируеми
. Проблемът може да бъде преоценен като намиране на всички възможни префикси към дадения модел за търсене ?
, който може да бъде оптимизиран по подобен начин като в този свързан отговор (за Postgres) на dba.SE: