Запрос условия с LIKE не соответствует точному соответствию - PullRequest
0 голосов
/ 17 мая 2011

Я использую следующий запрос для поиска пользователей:

  @users = User.find( :all,
                      :select => 'users.*',
                      :conditions => ["lower(fname) || ' ' || lower(lname) LIKE ?", '%'+"#{params[:q].downcase}"+'%'],
  )

Это прекрасно работает для таких примеров:

Bob S find Bob Smith
Bob finds Bob Smith

Проблема

Bob Smith does not find Bob Smith

Как я могу получить запрос выше, чтобы получить точное совпадение?Спасибо

1 Ответ

2 голосов
/ 17 мая 2011

Запрос просто неверный. Во-первых, '||' не является оператором конкатенации. Во-вторых, приоритет оператора делает его оцененным как:

(lower(fname)) || (' ') || (lower(lname) LIKE '%Bob Smith%')

это не то, что вы хотите. Я думаю, вам понравится:

concat(lower(fname), ' ', lower(lname)) LIKE '%Bob Smith%'

РЕДАКТИРОВАТЬ: Таким образом, вы можете использовать:

@users = User.find( :all,
                  :select => 'users.*',
                  :conditions => ["concat(lower(fname), ' ', lower(lname)) LIKE ?", "%#{params[:q].downcase}%"])

РЕДАКТИРОВАТЬ2: Выше, это неправильно, я не заметил, что это было о Postgresql Есть '||' оператор конкатенации в Postgres конечно. Я не удаляю этот пост из-за комментариев ниже, но не используйте его, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...