La domanda:
SELECT * FROM table WHERE ? LIKE (col || '%');
può essere riscritto come (Postgres e MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Come commentato, anche il primo modulo dovrebbe funzionare. Può essere complicato, però, perché personaggi con un significato speciale per LIKE
(almeno _%\
) nella colonna bisognerebbe scappare. Se vuoi che funzioni sia con MySQL che con Postgres, dovrai osservare i caratteri speciali in entrambe le implementazioni. Quindi il secondo modulo è molto meno soggetto a errori sul preside.
Prestazioni
Nessuna di queste query può utilizzare un indice su col
, entrambi non sono sargable
. Il problema può essere rivalutato trovando tutti i possibili prefissi per il modello di ricerca specificato ?
, che può essere ottimizzato in modo simile come in questa risposta correlata (per Postgres) su dba.SE: