Dotaz:
SELECT * FROM table WHERE ? LIKE (col || '%');
lze přepsat jako (Postgres a MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Jak bylo uvedeno, první formulář by měl fungovat také. Může to být složité, protože znaky se zvláštním významem pro LIKE
(nejméně _%\
) ve sloupci musel by utéct. Pokud chcete, aby fungoval jak s MySQL, tak s Postgres, budete muset v obou implementacích dodržovat speciální znaky. Takže 2. forma je mnohem méně náchylná k chybám na principu.
Výkon
Žádný z těchto dotazů nemůže používat index na col
, oba nejsou sargable
. Problém lze přehodnotit jako nalezení všech možných předpon k danému vyhledávacímu vzoru ?
, který lze optimalizovat podobným způsobem jako v této související odpovědi (pro Postgres) na dba.SE: