Frågan:
SELECT * FROM table WHERE ? LIKE (col || '%');
kan skrivas om som (Postgres och MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
Som kommenterat bör den första formen också fungera. Det kan dock vara knepigt eftersom karaktärer med speciell betydelse för LIKE
(minst _%\
) i kolumnen skulle behöva fly. Om du vill att det ska fungera med både MySQL och Postgres, måste du observera specialtecken i båda implementeringarna. Så den andra formen är mycket mindre felbenägen på rektor.
Prestanda
Ingen av dessa frågor kan använda ett index på col
, båda är inte sargable
. Problemet kan omvärderas som att hitta alla möjliga prefix till det givna sökmönstret ?
, som kan optimeras på liknande sätt som i detta relaterade svar (för Postgres) på dba.SE: