Mysql
 sql >> Baza danych >  >> RDS >> Mysql

? LIKE (kolumna || '%')

Zapytanie:

SELECT * FROM table WHERE ? LIKE (col || '%');

można przepisać jako (Postgres i MySQL):

SELECT * FROM table WHERE col = left(?, length(col));

Jak skomentowano, pierwsza forma również powinna działać. Może to być jednak trudne, ponieważ znaki o specjalnym znaczeniu dla LIKE (przynajmniej _%\ ) w kolumnie trzeba by było uciec. Jeśli chcesz, aby działał zarówno z MySQL, jak i Postgresem, musisz przestrzegać znaków specjalnych w obu implementacjach. Tak więc druga forma jest znacznie mniej podatna na błędy zleceniodawcy.

Wydajność

Żadne z tych zapytań nie może używać indeksu w col , oba nie są sargable . Problem można ponownie ocenić jako znalezienie wszystkich możliwych przedrostków do podanego wzorca wyszukiwania ? , który można zoptymalizować w podobny sposób, jak w tej powiązanej odpowiedzi (dla Postgres) na dba.SE:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mieszanie wyników z różnych kategorii, uporządkowanych według wyniku w MySQL

  2. przekonwertować znacznik czasu mysql na rzeczywistą datę i godzinę?

  3. PHP, MySQL, PDO Transactions - Czy kod wewnątrz bloku try zatrzymuje się na commit()?

  4. Wzrost wydajności MySQL po utworzeniu i upuszczeniu indeksu

  5. Kolumna Laravel 1048 nie może mieć wartości NULL podczas przechowywania danych