sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Solución genérica de Ruby para SQLite3 LIKE o PostgreSQL ILIKE?

La raíz del problema se encuentra aquí:

Estoy usando SQLite3 para desarrollo y PostgreSQL para implementación.

Esa es una mala idea™. Continuará encontrando incompatibilidades, o peor aún:no se dará cuenta de algunas hasta que el daño esté hecho.
Utilice el mismo RDBMS (PostgreSQL) para el desarrollo y la producción y ahórrese los problemas sin sentido.

Si bien está atascado con su desafortunada configuración, hay una solución simple :

lower(style) LIKE lower(?)

Funciona en ambas plataformas por igual.

  • Puede soltar el lower() de la derecha , si proporciona un patrón de búsqueda en minúsculas.

  • En SQLite estándar lower(X) solo dobla letras ASCII. Para más información, cito el capítulo Funciones principales en el manual de SQLite:

    La función lower(X) devuelve una copia de la cadena X con todos los caracteres ASCII convertidos a minúsculas. La función inferior () incorporada predeterminada funciona solo para caracteres ASCII. Para realizar conversiones de casos en caracteres que no sean ASCII, cargue la extensión ICU .

    Énfasis mío.

  • PostgreSQL lower(X) funciona con UTF-8 listo para usar.

Como efecto secundario bienvenido, puede acelerar esa consulta en PostgreSQL con un índice en la expresión lower(style) , que será más rápido que usar ILIKE y un índice básico sobre style .

Además, desde PostgreSQL 9.1 puede usar un índice GIN o GIST con el pg_trgm extensión para acelerar any LIKE y LIKE consulta:los trigramas no distinguen entre mayúsculas y minúsculas. Instrucciones detalladas y enlaces en esta respuesta relacionada:

  • Cadenas UTF-8 similares para el campo de autocompletar