PostgreSQL вроде не возвращает совпадающие экземпляры - PullRequest
2 голосов
/ 22 ноября 2011

Как работает функция PostrgeSQL like? Я использую токены для ограничения ввода пользователя только существующими значениями.

У меня есть следующие значения в БД:

  `Yellow, White, Orange...`

Мой код

 @colors = Color.where("name like ?", "%#{params[:q]}%")

Если я наберу w, например, White не предлагается. Я должен напечатать второе письмо, чтобы увидеть предложение Белого. Поскольку все значения Db начинаются с заглавной буквы, я подозреваю разницу с SQLite.

Я нашел этот пост , в котором упоминается ILIKE, но мне было интересно, есть ли какой-нибудь общий код, который работает как с Postgres, так и с SQLite.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Оператор SQLite LIKE не учитывает регистр по умолчанию.
В PostgreSQL ILIKE является регистронезависимой версией LIKE.Также есть операторы:

~~   .. LIKE
~~*  .. ILIKE
!~~  .. NOT LIKE
!~~* .. NOT ILIKE

Все эти три выражения в PostgreSQL практически одинаковы:

name ilike '%w%'
name ~~*   '%w%'
lower(name) like lower('%w%')

Последняя строка, в основном , работает в обоих SQLite и PostgreSQL .Я добавил ссылки на соответствующие страницы справочника.

Применяется ограничение: SQLite понимает только символы ASCII в нижнем / верхнем регистре, в то время как PostgreSQL понимает и другие символы UTF-8.

0 голосов
/ 22 ноября 2011

Чувствительность к регистру LIKE зависит от базы данных, которую вы используете. Некоторые базы данных игнорируют регистр при использовании LIKE, некоторые нет, некоторые рассматривают различные параметры конфигурации. Одним из способов решения этой проблемы является самостоятельная нормализация регистра путем преобразования в верхний или нижний регистр:

@colors = Color.where("lower(name) like ?", "%#{params[:q].downcase}%")
...