La consulta:
SELECT * FROM table WHERE ? LIKE (col || '%');
se puede reescribir como (Postgres y MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Como se comentó, la primera forma también debería funcionar. Sin embargo, puede ser complicado porque caracteres con significado especial para LIKE
(al menos _%\
) en la columna habría que escapar. Si desea que funcione tanto con MySQL como con Postgres, deberá observar los caracteres especiales en ambas implementaciones. Por lo tanto, la segunda forma es mucho menos propensa a errores en principal.
Rendimiento
Ninguna de estas consultas puede usar un índice en col
, ambos no son sargable
. El problema se puede volver a evaluar como encontrar todos los prefijos posibles para el patrón de búsqueda dado ?
, que se puede optimizar de manera similar a esta respuesta relacionada (para Postgres) en dba.SE: