A pergunta:
SELECT * FROM table WHERE ? LIKE (col || '%');
pode ser reescrito como (Postgres e MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Conforme comentado, o primeiro formulário também deve funcionar. Mas pode ser complicado porque personagens com significado especial para
LIKE
(pelo menos _%\
) na coluna teria que ser escapado. Se você quiser que funcione com MySQL e Postgres, você terá que observar caracteres especiais em ambas as implementações. Portanto, a segunda forma é muito menos propensa a erros no principal. Desempenho
Nenhuma dessas consultas pode usar um índice em
col
, ambos não são sargable
. O problema pode ser reavaliado como encontrar todos os prefixos possíveis para o padrão de pesquisa fornecido ?
, que pode ser otimizado de maneira semelhante, como nesta resposta relacionada (para Postgres) no dba.SE: