Zapytanie:
SELECT * FROM table WHERE ? LIKE (col || '%');
można przepisać jako (Postgres i MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Jak skomentowano, pierwsza forma również powinna działać. Może to być jednak trudne, ponieważ znaki o specjalnym znaczeniu dla LIKE
(przynajmniej _%\
) w kolumnie trzeba by było uciec. Jeśli chcesz, aby działał zarówno z MySQL, jak i Postgresem, musisz przestrzegać znaków specjalnych w obu implementacjach. Tak więc druga forma jest znacznie mniej podatna na błędy zleceniodawcy.
Wydajność
Żadne z tych zapytań nie może używać indeksu w col
, oba nie są sargable
. Problem można ponownie ocenić jako znalezienie wszystkich możliwych przedrostków do podanego wzorca wyszukiwania ?
, który można zoptymalizować w podobny sposób, jak w tej powiązanej odpowiedzi (dla Postgres) na dba.SE: