sql >> Databasteknik >  >> RDS >> Mysql

? GILLA (kolumn || '%')

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:



  1. Hur tar jag bort alla blanksteg från ett fält i en Postgres-databas i en uppdateringsfråga?

  2. Det gick inte att ladda sqlite-databasen vid första körningen

  3. Det aktiva resultatet innehåller inga fält som använder PDO med MS SQL

  4. java.lang.UnsupportedOperationException:org.hibernate.dialect.Oracle10gDialect stöder inte resultatuppsättningar via lagrade procedurer